WCF的使用方式

一、服务端的配置     在WCF中服务可以寄宿在不同类型的宿主中(WEB程序[IIS]、控制台程序、WinForm程序),需要引用System.ServiceModel 

       1、控制台程序: Main函数中

 class Program{
        static void Main(string[] args)
        {
            using (ServiceHost host=new ServiceHost(typeof(BLL.UserInfoService)))
            {
                host.Open();
                Console.ReadKey();
            }
        }
    }
       配置文件:

      

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="BLL.UserInfoService" behaviorConfiguration="behaviorConfiguration">   <!--服务名-->
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/"/>    <!--IP地址-->

          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="IBLL.IUserInfoService"></endpoint> <!--终结点中配置服务契约-->
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviorConfiguration">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

       2、WinForm程序 :可以写在窗体的构造函数中,但是容易造成线程的阻塞,所以尽量也写在WinForm程序的Main的函数中(代码大致同上)


       3、IIS  (WEB应用程序):需要创建SVC文件  并且修改配置文件

            为WCF添加Service.svc文件   <%@ServiceHost Service="BLL.UserInfoService"%>

             在IIS中进行配置 http://127.0.0.1:801/Service.svc(WEB程序发布到IIS会有相应的地址,客户端请求该地址下.svc文件即可)

             服务端配置文件的配置  添加

<system.ServiceModel>
  <services>
     <service name="BLL.UserInfoService">
       <endpoint binding="wsHttpBinding" contract="IBLL.IUserInfoService"/>
     </service>
  </services>
</system.ServiceModel>

二、客户端调用服务端的三种方式 (如果是调用web应用程序,配置文件中地址应指向.svc文件)

  1、和WebService一样  添加服务引用,获取相应的类(会自动修改配置文件)

ServiceReference1.WebService1SoapClient clint = new ServiceReference1.WebService1SoapClient();
            int r=clint.Test(3, 6);
             Response.Write(r);

  2、通过 svcutil 工具 :

   我们将使用微软的svcutil工具生成UserInfoService服务的客户端代理类,通过Visual Studio 2015命令提示(以管理员身份运行),启动命令环境。
   确认服务已启动
   切换当前路径到解决方案目录:cd  C://.........(当前目录)
    输入命令:svcutil http://localhost:8000/?wsdl /o:UserInfoServiceClient.cs  在指定目录自动创建服务客户端代理类 。执行成功后,会在解决方案    目录下生成两个文件:o:UserInfoServiceClient.cs 和output.config   把output.config重命名为App.config (如果自己引用了 IBLL.IUserInfoService) 就到配置文件中把相应的创建接口类的代码删除  和最后一个没用的方法  添加引用System.ServiceModel  

然后就可以在程序中调用服务端的方法了 

UserInfoServiceClient client = new UserInfoServiceClient();

    3、客户端代理 

   

<pre name="code" class="csharp"> ChannelFactory<IBLL.IUserInfoService> channelFactory =new ChannelFactory<IBLL.IUserInfoService>("BLL.UserInfoService");//创建一个通信工厂,需要指定通信的节点(EndPoint),在构建多个通信工厂时,参数要保持一致,这样能很好的利用缓存
{
     for(int i=0;i<3000;i++){
          IBLL.IUserInfoService channel=channelFactory.CreateChannel()//通过通信工厂创建通信信道
         int sum=channel.Add(6,7);
         Response.Write(sum.ToString());
         ((IClientChannel)channel).close();//关闭通信信道
     }
} 
这种方式开销比较小
{}

 

三 、WCF中的契约

   以上介绍的都是服务契约[ServiceContract]    

     还有数据契约 [DataContract]     用在调用实体模型(Model)中传输数据的时候,给模型加上[DataContract]  方便序列化进行传输

      消息契约[MessageContract] 指定数据成员为SOAP消息头  或者将指定成员序列化成SOAP正文中的元素   不设置的话默认都放在消息体中


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值