2

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(string message) の「Call」メソッドを呼び出すと、クライアントが null になります。

奇妙なことに、サービス構成を net.tcp から wsdualhttpbinding に設定すると、完全に機能します。この奇妙な問題を引き起こす可能性のある net.tcp と wsdualhttpbinding の間に違いはありますか?

4

2 に答える 2

1

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 に変更されても問題はないようです。

于 2014-04-09T10:58:21.950 に答える
0

ここで static の意味を誤解しています。このコンテキストでは、 static は、すべての CallBacker インスタンスで同じであることを意味します。次に、 concurency.multiple を使用すると、同時に複数のクライアントが callbacker.client を使用してコールバックする可能性がありますが、コンテキストは期待するものではありません。スタティックをドロップして、ログ ファイルにエラーが記録されているかどうかを確認します。

于 2014-04-07T07:25:03.803 に答える