zoukankan      html  css  js  c++  java
  • WCF进阶01 服务配置

    1. 准备工作

      在进行WCF服务配置的时候,我们先做一些准备性的工作,定义好服务协定,数据协定,下面简单地例举出关于服务协定代码,数据协定的代码片段。
    服务协定如下:
     [ServiceContract]
            
    public interface IContactServie
            {
                 [OperationContract]
                List
    <Contact> GetContracts();
            }
      其中,ServiceContract公布服务接口名称,OperationContract公布其服务协定操作方法,接口中未用特性标记OperationContract的方法不会
    公开被使用。
    数据协定如下:
     [DataContract]
        
    public class Contact
        {
            [DataMember]
            
    public String FirstName { getset; }
            [DataMember]
            
    public String LastName { getset; }
            [DataMember]
            
    public String EmailAddress { getset; }
        }
    需要注意的是,属性访问级别不影响数据协定中属性的公开。
    对于服务实现的代码片段如下:
    public class ContactService:IContactServie
        {
            
    public List<DataContractDomain.Person.Contact> GetContracts()
            {
                List
    <DataContractDomain.Person.Contact> contacts = new List<DataContractDomain.Person.Contact>();
                
    using (EntityProvider provider=new EntityProvider())
                {
                    var data 
    = from contact in provider.Contact.Take(10)
                               select 
    new { FirstName = contact.FirstName, LastName = contact.LastName, EmailAddress=contact.EmailAddress };

                    
    foreach (var item in data)
                    {
                        contacts.Add(
    new DataContractDomain.Person.Contact
                        { 
                            FirstName
    =item.FirstName,
                            LastName
    =item.LastName,
                            EmailAddress
    =item.EmailAddress
                        });
                    }
                }
                
    return contacts;
            }

        }

       以上是实现WCF服务最基本的操作,代码片段中服务协定我们使用了消息通信请求-应答的模式,另外还有单工、双工通信的方式,简单的实现方式需要在特性ServiceContract的特性属性中指定IsOneWay=true,双工通信需要指定客户端回调,使用特性属性CallbackContract指定需要调用的服务协定,回调的服务协定需要在客户端调用WCF时实现服务接口,以此来完成客户端、服务端的双向交互。

    2.WCF服务端配置

      服务端配置中包括服务终结点、绑定、行为,其中最重要的是配置服务终结点,终结点要指定地址、绑定类型、服务协定接口三个。终结点中的地址可以使用基地址 来指定;绑定类型有BasicHttpBinding,WsHtppBinding(BasicHttpBinding的“升级 版”),NetNamedPipeBinding,NetMsmqBinding等,另外,我们也可以实现自己的自定义绑定;服务协定接口需要对其命名空间 进行限定。

      下面是简单配置举例:

    <system.serviceModel>
        
    <services>
          
    <service name="ServiceContractImpl.Person.ContactService" behaviorConfiguration="ContactServiceBehavior">
            
    <host>
              
    <baseAddresses>
                
    <add baseAddress="http://localhost:8005/AdventureWorks/Person/ContactService"/>
                
    <add baseAddress="net.tcp://localhost:8003/AdventureWorks/Person/ContactService"/>
              
    </baseAddresses>
            
    </host>
            
    <endpoint address="" binding="wsHttpBinding" contract="ServiceContractDomain.Person.IContactServie">
              
    <identity>
                
    <dns value="localhost"/>
              
    </identity>
            
    </endpoint>
            
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            
            
    <endpoint address="" binding="netTcpBinding" contract="ServiceContractDomain.Person.IContactServie"/>
            
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
          
    </service>
        
    </services>
        
    <behaviors>
          
    <serviceBehaviors>
            
    <behavior name="ContactServiceBehavior">
              
    <serviceMetadata   httpGetEnabled="True"/>
              
    <serviceDebug includeExceptionDetailInFaults="False" />
            
    </behavior>
          
    </serviceBehaviors>
        
    </behaviors>
      
    </system.serviceModel>
      需要特别注意,服务名字需要明确指定命名空间;我们可以发布元数据,使用WCF框架内实现的IMetadataExchange服务协定来实现。
      服务托管后,可以通过浏览器浏览公开的服务发布的元数据信息:

     

     

      除了使用配置文件配置WCF服务端外,还可以通过编程方式实现:

    class Program
        {
            
    static void Main(string[] args)
            {
                Console.WriteLine(
    "Servcie Starting....");
                
    using (ServiceHost host = new ServiceHost(typeof(ServiceContractImpl.Person.ContactService)))
                {
                    
                    host.AddServiceEndpoint(
    typeof(ServiceContractDomain.Person.IContactServie), new NetTcpBinding(), "net.tcp://localhost:8003/AdventureWorks/Person/ContactService");
                    host.AddServiceEndpoint(
    typeof(ServiceContractDomain.Person.IContactServie), new BasicHttpBinding(), "http://127.0.0.1:8003/ServiceContractImpl/Person/ContactService");
                    host.Open();
                    Console.WriteLine(
    "Press <ENTER> to terminate client once the output is displayed.");
                    Console.ReadLine();
                }
               
            }
        }
     
    温馨提示,调试环境中,以托管方式承载服务的http绑定时,如果您的操作系统为Vista或Win7,VS开发环境需要以管理员权限运行才能托管服务。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    跨域请求页面跳转
    media query学习笔记
    JSONP跨域数据调用
    【转】轮询、长轮询、iframe长连接、web socket
    [转]node.js学习笔记(二)
    【转】require.js学习笔记(二)
    【转】require.js学习笔记(一)
    计算星期
    确定母亲节
    计算时钟的夹角
  • 原文地址:https://www.cnblogs.com/ecin/p/2078666.html
Copyright © 2011-2022 走看看