1

WSDualHttpBindingを使用してWCFコールバックを実装しようとしました。このサービスはIIS7でホストされています。

ホストと同じマシン上にサービスのサンプルクライアントを作成した場合、正常に動作します。しかし、ネットワーク上の別のシステムから同じクライアントを実行すると、タイムアウト例外が発生します

サーバースタックトレース:System.ServiceModel.Channels.ReliableRequestor.ThrowTimeoutException()at System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout)at System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout)at System.ServiceModel.Channels .ClientReliableDuplexSessionChannel.OnOpen(TimeSpan timeout)at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel、TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout、CallOnceManagercascade)atシステム.ServiceModel.Channels。ServiceChannel.EnsureOpened(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.Call(String action、Boolean oneway、ProxyOperationRuntime operation、Object [] ins、Object [] outs、TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.Call (String action、Boolean oneway、ProxyOperationRuntime operation、Object [] ins、Object [] outs)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message )。ProxyOperationRuntime操作、Object [] ins、Object [] outs)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime操作)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)ProxyOperationRuntime操作、Object [] ins、Object [] outs)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime操作)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageメッセージ)

CallbackContractは次のようになります。

 public interface IMyServiceCallBack
    {
        [OperationContract(IsOneWay = true)]
        void Notify();
}

私も指定しました

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Reentrant)]

クライアントのapp.configは次のとおりです。

 <wsDualHttpBinding>
            <binding name="WSDualHttpBinding_Callback" closeTimeout="00:01:00"                         clientBaseAddress="http://10.1.3.199:8002/myServiceHost/myService.svc/Endpoint"
                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                     maxBufferPoolSize="97108864" maxReceivedMessageSize="97108864"
                     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
              <readerQuotas maxDepth="32" maxStringContentLength="97108864" maxArrayLength="97108864"
                  maxBytesPerRead="97108864" maxNameTableCharCount="97108864" />              
              <security mode="None"/>
            </binding>
          </wsDualHttpBinding>
<client>
 <endpoint address="http://10.1.3.199/myServiceHost/myService.svc/Endpoint"
                binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_Callback"
                contract="myService.ServiceContract" name="WSDualHttpBinding_Callback" />
</client>

私は何が欠けていますか!!!

4

1 に答える 1

2

WSDualHttpBindingサーバーとクライアントの両方がポート 80 に到達できる場合にのみ機能します。はい、それはサーバーがクライアントへの TCP 接続を開こうとすることを意味します。WSDualHttpBindingほとんどのユーザーは、サーバーからクライアントに接続をルーティングしないルーターの後ろに座っているため、インターネット経由は基本的に役に立ちません。

同じネットワーク上にいる場合 (あなたが言ったように)、ポート 80 (または使用するポート) がクライアント マシンのファイアウォールによって許可されていることを確認する必要があります。

NetTcpBinding別の方法は、二重通信を可能にする単一の発信tcp 接続を開くを使用することです。これは、クライアントとサーバーが常に同じネットワーク上にある場合に適しています。

WSDualHttpBinding の詳細については、この投稿を参照してください。

于 2012-08-07T11:05:53.867 に答える