代码改变世界

WCF进阶01 服务配置

2011-06-12 01:01  Ecin  阅读(325)  评论(0编辑  收藏  举报

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开发环境需要以管理员权限运行才能托管服务。