在不知道合同的情况下调用WCF服务

时间:2011-10-15 14:59:52

标签: c# wcf nettcpbinding

我尝试执行以下操作:

我有一个运行TCP WCF服务的Windows服务。

现在,我想实现一个可以连接到此服务的客户端。但是这个客户不知道服务合同。他知道该服务确实提供了一种方法Download (string path)。我想连接到该服务并致电Download("c:\\temp\\xxx.exe")

我尝试了以下内容:

var myBinding = new NetTcpBinding(SecurityMode.None)
{
    TransferMode = TransferMode.Streamed,
    MaxBufferPoolSize = 524288,
    MaxBufferSize = 2147483647,
    MaxConnections = 254,
    MaxReceivedMessageSize = 2147483647,
    PortSharingEnabled = true
};

var myEndpoint = new EndpointAddress("net.tcp://localhost:6648/InstallerBootstrapperService");

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

IInstallerBootstrapperService client = null;

try {
    client = myChannelFactory.CreateChannel();
    client.Download("c:\\temp\\xxx.exe");
    ((ICommunicationObject) client).Close();
} catch {
   if (client != null) {
        ((ICommunicationObject) client).Abort();
   }
}

但是当我拨打Download()时会抛出异常。它说:

  

带有Action的消息   'Prayon.Service.Library / IInstallerBootstrapperService / Download'不能   由于ContractFilter不匹配而在接收方处理   EndpointDispatcher。这可能是因为合同不匹配   (发送方和接收方之间不匹配的操作)或绑定/安全性   发送者和接收者之间不匹配。检查发件人和   接收者具有相同的合同和相同的约束力(包括   安全要求,例如消息,传输,无)。

有没有办法可以在不知道合同的情况下调用服务方法?我可以在服务端更改某些内容,此客户端始终可以调用该方法吗?

1 个答案:

答案 0 :(得分:2)

服务器不知道客户端有什么作为合同,服务器知道什么是客户端将其作为SOAP请求发送,其中应该具有适当的信息,因此WCF管道将找到服务类型的适当合同并找到将要执行的操作也匹配。 根据过滤设置,服务类型和ServiceModel设置可以设置为不使用过滤,在这种情况下,您不需要匹配名称空间,例如,此外,服务器可以设置为特定方法捕获来自的所有调用客户端,无论SOAP请求中的信息如何。

因此,您得到的错误清楚地告诉您,过滤器不匹配意味着客户端上的合同的Namespace属性与服务器上的不同或安全设置不同

修复命名空间,你可以在客户端定义合同

 [ServiceContract(
      Namespace="namespaceuri",
      Name="contractname")]
 public interface IInstallerBootstrapperService {

      [OperationContract(
             Namespace="namespaceuri", 
             Action ="actionuri", 
             ReplyAction="replyactionuri")]
      void Download( string path);

 }

和两个属性的namespace属性应该与服务器上的属性相匹配。

修复其他可能不匹配的设置,您需要知道什么是transactionFlow,传输和消息安全性以及服务器端点的编码和消息转换

首先尝试netTcp默认设置,它们可能匹配