【发布时间】: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 核心部分 - 如果您的客户不知道合同,我非常怀疑您能否让客户调用您的服务。如果是这样,那将是一个严重的黑客攻击.....
-
marc_s,您应该提供您的回复作为真实答案。这就是答案。不是他想要的答案,但却是正确的答案。
标签: c# wcf nettcpbinding