首页 新闻 会员 周边 捐助

如何理解WCF宿主的概念?

0
悬赏园豆:5 [待解决问题]

如何理解WCF宿主的概念?

HerWorld的主页 HerWorld | 初学一级 | 园豆:111
提问于:2011-11-09 18:19
< >
分享
所有回答(3)
0

WCF宿主-IIS 

2011-09-13 15:59:53|  分类: Wcf |  标签: |字号订阅

 
 

导语:

  前一段时间开始学习WCF,尽管MSDN和网上的资料很多,但是由于刚开始接触WCF且学习资料不够详尽,所以弄的一头雾水,不知其中所表达的思想,经过这段时间的学习,终于搞明白了WCF常用的宿主。现在把学习到的知识记录下来,供以后参考,也希望能为WCF初学者带来一些帮助。

步骤:

一、定义消息

  消息的语义是指:服务中使用的数据对象。

  创建类库项目WCFMessage:开始-程序-Microsoft Visual Studio 2010-Microsoft Visual Studio 2010-文件-新建-项目-VisualC#-Windows-类库,解决方案名称:WCFHost,名称:WCFMessage。

  引入新的类库:System.Runtime.Serialization.dll

  创建类Person:删除项目自动生成的Class1.cs,新建一个Person类,代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization;

namespace WCFMessage {     [DataContract]     public class Person     {         [DataMember]         public string Id;         [DataMember]         public string Name;         [DataMember]         public int Age;     } } 二、定义服务协定

  服务协定的语义是指:定义服务的接口。

  创建类库项目WCFContract:右键解决方案'WCFHost'-添加-新建项目-VisualC#-Windows-类库,解决方案名称:WCFHost,名称:WCFContract。

  引入新的类库:System.ServiceModel.dll

  引入项目:WCFMessage

  创建类Person:删除项目自动生成的Class1.cs,新建一个IPersonService接口,代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using WCFMessage;

namespace WCFContract {     [ServiceContract]     public interface IPersonService     {         [OperationContract]         void AddPerson(Person person);         [OperationContract]         List<Person> GetPersons();         [OperationContract]         void RemovePerson(Person person);     } } 三、实现服务协定

  创建类库项目WCFService:右键解决方案'WCFHost'-添加-新建项目-VisualC#-Windows-类库,解决方案名称:WCFHost,名称:WCFService。

  引入项目:WCFMessage和WCFContract

  创建类PersonService:删除项目自动生成的Class1.cs,新建一个继承IPersonService接口的类PersonService,代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using WCFMessage; using WCFContract;

namespace WCFService {     public class PersonService:IPersonService     {         List<Person> list = new List<Person>();         public void AddPerson(Person person)         {             list.Add(person);         }

        public List<Person> GetPersons()         {             return list;         }

        public void RemovePerson(Person person)         {             list.Remove(list.Find(p => p.Id == person.Id));         }     } } 四、使用IIS承载服务

  创建WCF服务IISHost:右键解决方案'WCFHost'-添加-新建网站-VisualC#-WCF服务,解决方案名称:WCFHost,名称:IISHost。

  引入项目:WCFMessage,WCFContract,WCFService。

  删除AppCode目录下自动生成的IService.cs接口和Service1.cs

      修改Service.svc文件,修改后的内容如下:

<%@ ServiceHost Language="C#" Debug="true" Service="WCFService.PersonService"%>   修改Web.config配置文件,这一步很关键,这是导致错误的主要原因所在地,修改后的内容如下:

<?xml version="1.0" encoding="utf-8"?> <configuration>   <system.web>     <compilation debug="false" targetFramework="4.0" />   </system.web>   <system.serviceModel>     <behaviors>       <serviceBehaviors>         <behavior>           <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->           <serviceMetadata httpGetEnabled="true"/>           <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->           <serviceDebug includeExceptionDetailInFaults="false"/>         </behavior>       </serviceBehaviors>     </behaviors>     <services>       <!-- This section is optional with the default configuration         model introduced in .NET Framework 4 -->       <service  name="WCFService.PersonService">     <endpoint address=""                   binding="wsHttpBinding"                   contract="WCFContract.IPersonService" />       </service>     </services>     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />   </system.serviceModel>   <system.webServer>     <modules runAllManagedModulesForAllRequests="true"/>   </system.webServer>   </configuration>  发布服务:右键IISHost-发布网站,按照向导把服务发布到你指定的目录下。

  发布目录的文件夹权限设置:一要Web共享,二要给ASP.NET用户(IUSER)足够的权限。

    在IIS上为发布的服务建立虚拟目录:开始-运行-inetmgr-Internet信息服务-XXX(本地计算机)-网站-默认网站,右键-新建-虚拟目录,按照向导完成。其中,别名:IISHost,目录:发布服务的目录,访问权限:除过写入,都勾选。

  测试:在虚拟目录下,浏览Service.svc,如果出现类似如下的页面显示,则表示成功。

PersonService 服务

已创建服务。

若要测试此服务,需要创建一个客户端,并将其用于调用该服务。可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作:

 

svcutil.exe http://localhost/IISHost/Service.svc?wsdl

这将生成一个配置文件和一个包含客户端类的代码文件。请将这两个文件添加到客户端应用程序,并使用生成的客户端类来调用服务。例如:

C#

class Test {     static void Main()     {         PersonServiceClient client = new PersonServiceClient();

        // 使用 "client" 变量在服务上调用操作。

        // 始终关闭客户端。         client.Close();     } }

 

Visual Basic

Class Test     Shared Sub Main()         Dim client As PersonServiceClient = New PersonServiceClient()         ' 使用 "client" 变量在服务上调用操作。

        ' 始终关闭客户端。         client.Close()     End Sub End Class

有关安装IIS和运行WCF服务的更多信息,请参考http://msdn.microsoft.com/zh-cn/library/ms751518.aspxhttp://msdn.microsoft.com/zh-cn/library/ms752252.aspx

五、测试服务

  生成客户端代理文件:开始-程序-Microsoft Visual Studio 2010-Visual Studio Tools-Visual Studio 命令提示(2010),输入cd /d E:\outputFiles,再输入svcutil.exe http://localhost/IISHost/Service.svc?wsdl,则会生成两个文件PersonService.cs和output.config。

  建立客户端应用程序:新建一个控制台应用程序(或着Windows窗体应用程序,或者WPF应用程序),这里以控制台应用程序为例,添加刚才生成的两个客户端代理文件PersonService.cs和output.config。

  引用新的类库System.Runtime.Serialization.dll和System.ServiceModel.dll

     编辑Program.cs,如下:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using WCFMessage;

namespace ConsoleApplicationClient {     class Program     {         static void Main(string[] args)         {             PersonServiceClient client = new PersonServiceClient();             Person person = new Person();             person.Id = "610623195604230123";             person.Name = "张三";             person.Age = 54;             client.AddPerson(person);             Person[] list = client.GetPersons();             Console.WriteLine("Person information Id:{0},Name:{1},Age:{2}",list[0].Id,list[0].Name,list[0].Age);             client.RemovePerson(person);             client.Close();         }     }

cher_chou | 园豆:25 (初学一级) | 2011-11-10 00:25
3

可以理解为运行WCF本身的环境

dotNetDR_ | 园豆:2078 (老鸟四级) | 2011-11-14 21:37
1

就是运行wcf服务的程序

klice | 园豆:173 (初学一级) | 2011-12-31 17:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册