學習WCF netTcpBinding使用

1.定義接口IFly

View Code
namespace TECO
{
[ServiceContract]
public interface IFly
{
[OperationContract]
string Fly(string name);
}
}

2.定義服務

View Code
namespace TECO
{
public class People:IFly
{

#region IFly 成員

public string Fly(string name)
{
return string.Format("{0}:會飛",name);
}

#endregion
}
}

其中:<service behaviorConfiguration="MessageBehavior" name="TECO.People">

中的name為實際的操作類。

3.定義宿主 host,啟動服務

View Code
   public class Program {
static void Main(string[] args) {

using (ServiceHost host = new ServiceHost(typeof(People)))
{
host.Open();
Console.WriteLine("服務已經啟動");
Console.Read();
}

}
}

4.配置app.config 文件

代碼如下:

View Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<system.serviceModel>

<behaviors>
<serviceBehaviors>
<behavior name="MessageBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MessageBehavior" name="TECO.People">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="Binding1"
contract
="TECO.IFly" />
<endpoint address="net.tcp://localhost:4503/People/mex" binding="mexTcpBinding"
contract
="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:1234/People" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="Binding1"
closeTimeout
="00:01:00"
openTimeout
="00:01:00"
receiveTimeout
="00:10:00"
sendTimeout
="00:01:00"
transactionFlow
="false"
transferMode
="Buffered"
transactionProtocol
="OleTransactions"
hostNameComparisonMode
="StrongWildcard"
listenBacklog
="10"
maxBufferPoolSize
="524288"
maxBufferSize
="65536"
maxConnections
="10"
maxReceivedMessageSize
="65536">
<readerQuotas maxDepth="32"
maxStringContentLength
="8192"
maxArrayLength
="16384"
maxBytesPerRead
="4096"
maxNameTableCharCount
="16384" />
<reliableSession ordered="true"
inactivityTimeout
="00:10:00"
enabled
="false" />
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>

5.客戶端使用代碼調用,代碼如下:

View Code
  class Program
{
static void Main(string[] args)
{
//使用代理類調用
ServiceReference1.FlyClient clent = new ServiceReference1.FlyClient();
Console.WriteLine(clent.Fly("zzy"));

//直接代碼調用
NetTcpBinding myBinding = new NetTcpBinding(SecurityMode.None);


EndpointAddress myEndpoint = new EndpointAddress("net.tcp://localhost:1234/People");

ChannelFactory<IFly> myChannelFactory = new ChannelFactory<IFly>(myBinding, myEndpoint);

// Create a channel.
IFly wcfClient1 = myChannelFactory.CreateChannel();
string s = wcfClient1.Fly("gsw");
Console.WriteLine(s.ToString());
((IClientChannel)wcfClient1).Close();

myChannelFactory.Close();
Console.Read();
}
}

需要說明: NetTcpBinding myBinding = new NetTcpBinding(SecurityMode.None);定義綁定類型

               EndpointAddress myEndpoint = new EndpointAddress("net.tcp://localhost:1234/People");定義url,提供服務地址

              由於 客戶端沒有IFly接口,因此,需要在客戶端定義一個接口,接口要與服務器端的接口一樣。

6.使用代理類調用服務:

6.1 添加引用,如果添加引用,服務器配置文件需要做如下處理:

加入另一個總結點: 

<endpoint address="net.tcp://localhost:4503/People/mex" binding="mexTcpBinding"
          contract="IMetadataExchange" />

為了使用此終結點,需要定義如下:

   <behaviors>
<serviceBehaviors>
<behavior name="MessageBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>

其中:<serviceMetadata httpGetEnabled="false"/> 表示元數據發佈,只有元數據發佈后,才能在客戶端,添加引用。

點擊添加引用:輸入路徑為net.tcp://localhost:4503/People/mex,此時需要先啟動服務。如果服務啟動了,那麼可以看到服務的內容。

點確定會生成客戶端代理。我這裡是:ServiceReference1

6.2 在客戶端使用代理類操作

代碼如下:

     //使用代理類調用
            ServiceReference1.FlyClient clent = new ServiceReference1.FlyClient();
            Console.WriteLine(clent.Fly("zzy"));
7.題外話:

在win7下面,運行vs調試環境的wcf服務,需要以管理員身份打開vs。在vs菜單上,點右鍵,選擇"以管理員運行",就可以了。

 







posted @ 2012-04-01 18:31  無限遐想  阅读(6873)  评论(0编辑  收藏  举报