繁体   English   中英

将其存储到静态变量时无法访问OperationContext.Current

[英]I cannot reach OperationContext.Current when I store it to a static variable

我有一个由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);
   }
}

当客户端调用Service的Register方法时,可以看到通道存储在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>

在使用netTcpBinding时,CallBacker.Client保留CallBackContract的值,并且如果CallBackContract更改为IServiceCallback,似乎没有任何问题。

您在这里误解了static的含义。 在这种情况下,静态意味着每个CallBacker实例都相同。 然后使用concurency。多个客户端可以同时使用多个callbacker.client进行回调,但是上下文不会是您期望的。 删除静态文件,然后查看日志文件中是否有任何错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM