none
WCF 由于ContractFilter 在 EndpointDispatcher 不匹配........ RRS feed

  • 问题

  • using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
    using System.ServiceModel;
    
    
    
    namespace Host
    
    {
    
    
    
        [ServiceContract]
    
        public interface IHello
    
        {
    
            [OperationContract]
    
            string Test(string s);
    
        }
    
        
    
        public class HelloImpl : IHello
    
        {
    
    
    
            public string Test(string s)
    
            {
    
                return "Hello " + s + "  "+ DateTime.Now.ToString("yyyy-MM-yy HH:mm:ss");
    
            }
    
        }
    
    }
    
    <pre lang="x-c#">using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
    using System.ServiceModel;
    
    using System.ServiceModel.Description;
    
    
    
    namespace Host
    
    {
    
        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                using (ServiceHost host = new ServiceHost(typeof(HelloImpl)))
    
                {
    
                    NetTcpBinding newTcpBinding = new NetTcpBinding();
    
    
    
                    host.AddServiceEndpoint(typeof(IHello), newTcpBinding, "net.tcp://10.0.1.122:8000/IHello");
    
                    host.Open();
    
                    Console.WriteLine(".....");
    
                    Console.Read();
    
                }
    
            }
    
        }
    
    }
    
    
    
    
    我启动server端后。(telnet 10.0.1.122 8000)能连上

    客户端

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;

    namespace Client
    {
        [ServiceContract]
        public interface IHello
        {
            [OperationContract]
            string Hello(string s);
        }

    }

    客户端调用

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
    using System.ServiceModel;
    
    
    
    namespace Client
    
    {
    
        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                EndpointAddress endpointAddress = new EndpointAddress("net.tcp://10.0.1.122:8000/IHello");
    
               
    
               // IHello proxy = ChannelFactory<IHello>.CreateChannel(typeof(IHello),new NetTcpBinding(SecurityMode.None),endpointAddress);
    
                IHello proxy = ChannelFactory<IHello>.CreateChannel(new NetTcpBinding(), endpointAddress);
    
                try
    
                {
    
                    Console.WriteLine(proxy.Hello("Test"));
    
                }
    
                catch (Exception ex)
    
                {
    
                    Console.WriteLine(ex.StackTrace);
    
                    Console.WriteLine("\n");
    
                    Console.WriteLine(ex.Message);
    
                }
    
    
    
                Console.Read();
    
    
    
            }
    
        }
    
    }
    
    由于  ContractFilter 在 EndpointDispatcher 不匹配,
    因此 Action 为“http://tempuri.org/IHello/Hello”<br/>的消息无法在接收方处理。
    这可能是由于协定不匹配(发送方和接收方 Action 不匹配)<br/>或发送方和接收方绑定/安全不匹配。
    请检查发送方和接收方是否具有相同的协定和绑定(包括安全要求,如 Message、Transport、None)。<br/>
    不知道是什么原因造成这样的错误~ 请各路达人帮忙<br/><br/><br/><br/><br/><br/><br/><br/>
    2009年8月21日 5:06

答案

  • Hi,
      这个是你客户端调用WCF服务使用的终结点错误导致的。
      "net.tcp://10.0.1.122:8000/IHello")地址宿主里定义的服务中节点。
    在客户端会有特定的Action,来匹配相应的服务操作方法。符合WS-Address规范。
      不是实际的地址。
       <wsdl:operation name="SayHelloToUser">
          <soap12:operation soapAction="http://www.cnblogs.com/frank_xl/IWCFService/SayHelloToUser" style="document" />
          <wsdl:input>
            <wsp:PolicyReference URI="#WSHttpBinding_IWCFService_SayHelloToUser_Input_policy" />
            <soap12:body use="literal" />
          </wsdl:input>
          <wsdl:output>
            <wsp:PolicyReference URI="#WSHttpBinding_IWCFService_SayHelloToUser_output_policy" />
            <soap12:body use="literal" />
          </wsdl:output>
        </wsdl:operation>
      我的测试代码。这里客户端Action的地址,蓝色字体,已经变化。
       WCF会自动映射这和地址到服务特定的方法,然后转发客户端消息。

       你客户端直接使用的终结点地址有问题。


     可以尝试先使用添加服务引用的或svcutil.exe方式来生成客户端文件,然后在尝试修改。

      你可以参考这个文章:WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解 。有参考代码下载。
      
       一般《Essential WCF》( WCF本质论)这本书的读者喜欢自己手动编写客户端代码来调用WCF服务。

    有问题在交流~

    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年8月21日 5:21
    版主

全部回复

  • Hi,
      这个是你客户端调用WCF服务使用的终结点错误导致的。
      "net.tcp://10.0.1.122:8000/IHello")地址宿主里定义的服务中节点。
    在客户端会有特定的Action,来匹配相应的服务操作方法。符合WS-Address规范。
      不是实际的地址。
       <wsdl:operation name="SayHelloToUser">
          <soap12:operation soapAction="http://www.cnblogs.com/frank_xl/IWCFService/SayHelloToUser" style="document" />
          <wsdl:input>
            <wsp:PolicyReference URI="#WSHttpBinding_IWCFService_SayHelloToUser_Input_policy" />
            <soap12:body use="literal" />
          </wsdl:input>
          <wsdl:output>
            <wsp:PolicyReference URI="#WSHttpBinding_IWCFService_SayHelloToUser_output_policy" />
            <soap12:body use="literal" />
          </wsdl:output>
        </wsdl:operation>
      我的测试代码。这里客户端Action的地址,蓝色字体,已经变化。
       WCF会自动映射这和地址到服务特定的方法,然后转发客户端消息。

       你客户端直接使用的终结点地址有问题。


     可以尝试先使用添加服务引用的或svcutil.exe方式来生成客户端文件,然后在尝试修改。

      你可以参考这个文章:WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解 。有参考代码下载。
      
       一般《Essential WCF》( WCF本质论)这本书的读者喜欢自己手动编写客户端代码来调用WCF服务。

    有问题在交流~

    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年8月21日 5:21
    版主
  • 谢谢你!

    我还想请教下,是不是非要有配置文件... 因为我的服务端是Windows服务。客户端也是比较特殊的程序在调用。。不能放配置文件.
    2009年8月21日 9:25
  • 不要客气~~
      不是的。
      配置文件的好处就是灵活。
      你编译以后可以修改配置文件来改变一些设置。
      但是WCF配置文件能设置的,都可以使用代码来完成。
       呵呵。
      不过你要写一些属性定制的代码~
    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年8月21日 9:37
    版主