gpt4 book ai didi

c# - 使用 NetTcpBinding 的双工通信 - ContractFilter 不匹配?

转载 作者:行者123 更新时间:2023-11-30 22:42:13 25 4
gpt4 key购买 nike

我在使用 NetTcpBinding 在客户端和服务器之间打开双工通信 channel 方面取得了缓慢而稳定的进展。 (仅供引用,您可以观察我的新手进度 herehere!)

我现在已经成功连接到我的服务器,通过服务器的防火墙,客户端可以向服务器发出请求。

然而,另一方面,事情并不那么令人愉快。在我自己的机器上测试时它工作正常,但是在互联网上测试时,当我尝试从服务器端发起回调时,我得到一个错误:

The message with Action 'http://MyWebService/IWebService/HelloWorld' cannot be
processed at the receiver,
due to a ContractFilter mismatch at the EndpointDispatcher.
This may be because of either a contract mismatch (mismatched Actions between
sender and receiver)
or a binding/security mismatch between the sender and the receiver.
Check that sender and receiver have the same contract and the same binding
(including security requirements, e.g. Message, Transport, None).

以下是代码的一些关键位。一、网页界面:

[ServiceContract(Namespace = "http://MyWebService", SessionMode = SessionMode.Required, CallbackContract = typeof(ISiteServiceExternal))]
public interface IWebService {
[OperationContract]
void Register(long customerID);
}

public interface ISiteServiceExternal {
[OperationContract]
string HelloWorld();
}

这是 IWebService 的实现:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class WebService : IWebService {
void IWebService.Register(long customerID) {
Console.WriteLine("customer {0} registering", customerID);
var callbackService = OperationContext.Current.GetCallbackChannel<ISiteServiceExternal>();
RegisterClient(customerID, callbackService);
Console.WriteLine("customer {0} registered", customerID);
}
}

然后,在客户端(我在不知不觉中摆弄这些属性):

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, Namespace="http://MyWebService")]
class SiteServer : IWebServiceCallback {
string IWebServiceCallback.HelloWorld() {
return "Hello World!";
}
...
}

那么我做错了什么?

编辑: 添加 app.config 代码。来自服务器:

<system.serviceModel>
<diagnostics>
<messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true" logEntireMessage="true" maxMessagesToLog="1000" maxSizeOfMessageToLog="524288" />
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceMetadata/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name ="MyWebService.WebService" behaviorConfiguration="mex">
<endpoint address="net.tcp://localhost:8000" binding="netTcpBinding" contract="MyWebService.IWebService"
bindingConfiguration="TestBinding" name="MyEndPoint"></endpoint>
<endpoint address ="mex"
binding="mexTcpBinding"
name="MEX"
contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8000"/>
</baseAddresses>
</host>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="TestBinding" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" portSharingEnabled="false">
<readerQuotas maxDepth="32" maxStringContentLength ="8192" maxArrayLength ="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>

在客户端:

<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="MyEndPoint" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://mydomain.gotdns.com:8000/" binding="netTcpBinding"
bindingConfiguration="MyEndPoint" contract="IWebService" name="MyEndPoint" />
</client>
</system.serviceModel>

最佳答案

感谢@Allon Guralnek,他帮助我注意到问题所在:

在服务器端我有:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class WebService : IWebService { ... }

在客户端我有:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, Namespace="http://MyWebService")]
class SiteServer : IWebServiceCallback { ... }

冲突发生在 PerCallPerSession 之间。我刚刚将服务器端更改为 PerSession,而且 - 休斯顿,我们已经起飞了!

现在,要让它与安全性一起工作...请观看 SO 以了解我的 WCF 学习曲线中的下一个激动人心的部分! :)

关于c# - 使用 NetTcpBinding 的双工通信 - ContractFilter 不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4534923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com