【问题标题】:Call WCF service without knowing the contract在不知道合约的情况下调用 WCF 服务
【发布时间】:2011-10-15 14:59:51
【问题描述】:

我尝试执行以下操作:

我有一个运行 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() 时,这会引发异常。它说:

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

有没有办法在不知道合同的情况下调用服务方法?我可以在服务端改变一些东西,让这个客户端总是可以调用该方法吗?

【问题讨论】:

  • 您需要为合约和操作提供适当的命名空间。服务会暴露 MEX 或发现 btw 吗?
  • 命名空间是什么意思? - 该服务不公开 MEX 或发现。
  • 简而言之:没有。合同是整个 WCF 服务架构的THE 核心部分 - 如果您的客户不知道合同,我非常怀疑您能否让客户调用您的服务。如果是这样,那将是一个严重的黑客攻击.....
  • 这听起来类似于stackoverflow.com/q/54579/701062
  • marc_s,您应该提供您的回复作为真实答案。这就是答案。不是他想要的答案,但却是正确的答案。

标签: c# wcf nettcpbinding


【解决方案1】:

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

所以你得到的错误清楚地告诉你过滤器不匹配,这意味着客户端上合同的命名空间属性与服务器上的不同或安全设置不同

要修复命名空间,您可以像这样在客户端上定义合同

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

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

 }

两个属性的命名空间属性应该与服务器上的匹配。

要修复可能不匹配的其他设置,您需要了解哪些事务流、传输和消息安全以及服务器端点的编码和消息版本

首先尝试他们可能匹配的 netTcp 默认设置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多