我尝试执行以下操作:
我有一个运行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。这可能是因为合同不匹配 (发送方和接收方之间不匹配的操作)或绑定/安全性 发送者和接收者之间不匹配。检查发件人和 接收者具有相同的合同和相同的约束力(包括 安全要求,例如消息,传输,无)。
有没有办法可以在不知道合同的情况下调用服务方法?我可以在服务端更改某些内容,此客户端始终可以调用该方法吗?
答案 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默认设置,它们可能匹配