当我将它存储到静态变量时,我无法访问 OperationContext.Current
本文关键字:OperationContext Current 访问 变量 存储 静态 | 更新日期: 2023-09-27 17:56:02
我有一个由net.tcp绑定配置的WCF服务。我可以通过客户端访问服务并可以调用它的方法。我也可以到达OperationContext.Current。如:
[ServiceContract(CallbackContract = typeof(IServiceCallback))]
public interface IService
{
[OperationContract(IsOneWay = true)]
void Register();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service :IService
{
public void Register()
{
CallBacker.Client = OperationContext.Current.
GetCallbackChannel<IServiceCallback>();
}
}
}
public class CallBacker
{
public static IServiceCallback Client { get; set; }
public void Call(string message)
{
Client.Test(message);
}
}
当客户端调用服务的注册方法时,我可以看到通道存储在 CallBacker.Client 上,但是当我调用 CallBacker> Call(字符串消息)的"Call"方法时,客户端为空。
奇怪的是,当我将服务配置从net.tcp设置为wsdualhttpbinding时,它工作得很好。net.tcp 和 wsdualhttpbinding 之间有什么区别会导致这个奇怪的问题吗?
似乎 CallbackContract 应该是 IServiceCallback 的类型 [ServiceContract(CallbackContract = typeof(IServiceCallback))]
以下是wsDualHttpBinding和netTcpBinding的配置
。<services>
<service behaviorConfiguration="behavior" name="WCFCallbackTry.Service1">
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="HttpEndPoint"
contract="WCFCallbackTry.IService" name="HttpEndPoint"/>
<endpoint address="net.tcp://localhost:8004/Service1.svc" bindingConfiguration="BindingConfiguration" binding="netTcpBinding"
contract="WCFCallbackTry.IService" name="NetTcpEndPoint"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8018/Service1.svc"/>
</baseAddresses>
</host>
</service>
</services>
另请找到使用的netTcpBinding
。<netTcpBinding>
<binding name="BindingConfiguration" receiveTimeout="infinite" sendTimeout="10.00:00:00" maxBufferPoolSize="1073741824" maxBufferSize="1073741824" maxReceivedMessageSize="1073741824">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<reliableSession enabled="true" inactivityTimeout="01:00:00" ordered="true" />
</binding>
</netTcpBinding>
CallBacker.Client 在使用 netTcpBinding 时保存 CallBackContract 的值,如果将 CallBackContract 更改为 IServiceCallback 似乎没有任何问题。
你在这里误解了静态的含义。在此上下文中,静态意味着每个 CallBacker 实例都相同。然后,使用您的 concurency.多个客户端同时使用您的 callbacker.client 进行回调,但上下文不会是您期望的上下文。删除静态,然后查看日志文件中是否有任何错误。