none
关于netTcpBinding的问题 RRS feed

  • 问题

  • 写了个简单的WCF用netTcpBinding绑定。
    服务器端代码如下:
    [ServiceContract(Namespace="http://org.com",SessionMode=SessionMode.Allowed)]
        interface IService
        {
            [OperationContract]
            void SayHello();
        }
     [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
        public class ServicePerCall:IService,IDisposable
        {
    public ServicePerCall()
            {
                Console.WriteLine("ServicePerCall is created...");
            }
     }

    宿主端的代码如下:
     using(ServiceHost hostPerCall = new ServiceHost(typeof(Service.ServicePerCall)))
               {
                   hostPerCall.Open();
                   Console.WriteLine("ServicePerCall is runing! and state is {0}",hostPerCall.State);
               }
    宿主端配置:
    <system.serviceModel>
        <services>
          <service behaviorConfiguration="Service.ServiceBehavior" name="Service.ServicePerCall">
            <endpoint
              address="net.tcp://localhost:8001/ServicePerCall"
              binding="netTcpBinding"
              contract="Service.IService"
              bindingConfiguration="Service.ServiceBind" />
            <endpoint
              address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" >
            </endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost:8001/"/>
              </baseAddresses>
            </host>
           
          </service>
    </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="Service.ServiceBehavior">
              <serviceDebug includeExceptionDetailInFaults="false"/>
              <serviceMetadata httpGetEnabled="false"/>         
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    客户端代码:
    IService proxy = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8001/ServicePerCall"));
    proxy.SayHello();

    问题点:一,为什么客户端这么调用老是掉不到,报 “报tcp错误code是10061”。
    二,我宿主是用控制台写的,为什么服务打开了,客户端点参照却参照不到net.tcp://localhost:8001/ServicePerCall服务,应该怎么参照
    2009年12月10日 8:00

答案

  • Hi:Galactica
    果然好用,谢谢。但是还是不太明白其中道理

    我告诉你一个学习的方法。

    1,服务器用
    <netTcpBinding>
            <binding name="Service.ServiceBind">
              <security mode="None"/>
            </binding>
    </netTcpBinding>
    配置绑定,然后通过添加服务引用或者用wsdl工具等生成wcf客户端;

    2,启动服务的代码中,使用
    new NetTcpBinding() 和 new EndpointAddress("net.tcp://localhost:8001/ServicePerCall"))来启动服务宿主,
    不要使用配置文件来启动服务,然后通过添加服务引用或者用wsdl工具等生成wcf客户端;

    你比较下这两种方式生成的客户端配置文件中绑定一节的申明。
    2009年12月11日 8:42

全部回复

  • Hi,
    元数据地址是:net.tcp://localhost:8001/mex;
    你再看看
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年12月10日 16:02
    版主
  • 你的宿主代码有问题,不知道是不是你有意为止,总之,tcp 10061,就是tcp未连通的意思,也就是物理连接无法建立.

    using(ServiceHost hostPerCall = new ServiceHost(typeof(Service.ServicePerCall)))
    {
        hostPerCall.Open();
        Console.WriteLine("ServicePerCall is runing! and state is {0}",hostPerCall.State);

        // 下面这句让 Console 程序阻止主线程退出.
        Console.Read();
    }

    另外,你在服务端配置了 bindingConfiguration="Service.ServiceBind" ,
    但是,你却忘记把名称为 Service.ServiceBind 的 tcpBinding 配置节贴出来了.
    2009年12月11日 6:14

  • Hi:Frank Xu Lei
    我看了你的博客里面也是这么写的啊
    net.tcp://localhost:8001/
    这样的,顺便我改成net.tcp://localhost:8001/mex还是不行

    Hi:Galactica
    按照你的写法我改了,也是不行

    2009年12月11日 8:09
  • Hi:Galactica

    配置重新贴下
    <system.serviceModel>
        <services>
          <service behaviorConfiguration="Service.ServiceBehavior" name="Service.ServicePerCall">
            <endpoint
              address="net.tcp://localhost:8001/ServicePerCall"
              binding="netTcpBinding"
              contract="Service.IService"
              bindingConfiguration="Service.ServiceBind" />
            <endpoint
              address="mex"
              binding="mexTcpBinding"
              contract="IMetadataExchange" >
            </endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost:8001/"/>
              </baseAddresses>
            </host>
           
          </service>
     </services>
     <behaviors>
          <serviceBehaviors>
            <behavior name="Service.ServiceBehavior">
              <serviceDebug includeExceptionDetailInFaults="false"/>
              <serviceMetadata httpGetEnabled="false"/>         
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <bindings>
          <netTcpBinding>
            <binding name="Service.ServiceBind">
              <security mode="None"/>
            </binding>
          </netTcpBinding>
        </bindings>
      </system.serviceModel>
    2009年12月11日 8:11
  • 把 <security mode="None"/> 这一行注释掉。

    通过IService proxy = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8001/ServicePerCall"));
    创建的通道和
    <netTcpBinding>
            <binding name="Service.ServiceBind">
              <security mode="None"/>
            </binding>
          </netTcpBinding>
    并不是同样的绑定设置。

    2009年12月11日 8:32
  • Hi:Galactica
    果然好用,谢谢。但是还是不太明白其中道理
    2009年12月11日 8:36
  • Hi:Galactica
    果然好用,谢谢。但是还是不太明白其中道理

    我告诉你一个学习的方法。

    1,服务器用
    <netTcpBinding>
            <binding name="Service.ServiceBind">
              <security mode="None"/>
            </binding>
    </netTcpBinding>
    配置绑定,然后通过添加服务引用或者用wsdl工具等生成wcf客户端;

    2,启动服务的代码中,使用
    new NetTcpBinding() 和 new EndpointAddress("net.tcp://localhost:8001/ServicePerCall"))来启动服务宿主,
    不要使用配置文件来启动服务,然后通过添加服务引用或者用wsdl工具等生成wcf客户端;

    你比较下这两种方式生成的客户端配置文件中绑定一节的申明。
    2009年12月11日 8:42