Azure で net.tcp リレー通信を使用すると、クライアントでコントラクト/フィルターの不一致の例外が発生し続けます。
この問題は、次の条件下でのみ発生します。
- azure net.tcp リレー バインディングの使用
- ハイブリッド モードに設定されたバインディング (サービスが相互に到達できるようにローカルで実行)
- サービス インターフェイスは、単なるデータ コントラクトではなくタスクを返します
インターフェース:
[ServiceContract]
public interface IService1
{
[OperationContract]
Task<string> GetData(int value);
}
サービス例:
public class Service1 : IService1
{
public Task<string> GetData(int value)
{
return Task.FromResult(string.Format("You entered: {0}", value));
}
}
数秒後にバインドが直接接続に切り替わると、コントラクトの不一致例外がスローされるようになります。これは赤いニシンです。何が起こっているかというと、チャネルが混乱しているということだと思います。
クライアントの使用例 (残念ながら問題を解決していないように見えるタスクの継続に注意してください):
var relaybinding = new NetTcpRelayBinding();
relaybinding.Security.Mode = EndToEndSecurityMode.None;
relaybinding.ConnectionMode = TcpRelayConnectionMode.Hybrid;
_cf = new ChannelFactory<IService1>(
relaybinding,
new EndpointAddress( ServiceBusEnvironment.CreateServiceUri("sb", "<<relayservicename>>", "test")));
_cf.Endpoint.Behaviors.Add(new TransportClientEndpointBehavior { TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("<<policyname>>", "<<token>>") });
return _cf;
var ch = _cf.CreateChannel();
((IChannel)ch).Open();
var result = ch.GetData(10);
var cont = result.ContinueWith(x =>
{
try
{
var r = x.Result;
((IChannel)ch).Close();
return r;
}
catch (Exception e)
{
((IChannel)ch).Abort();
throw;
}
}, TaskContinuationOptions.ExecuteSynchronously);
実行中にリレー バインディングが「ダイレクト」モードに切り替わるとすぐに、コントラクト/フィルターの不一致の例外 (追加) が定期的に発生し始めます。コールバックを渡します。
nettcprelay バインディングが内部で機能する方法には、呼び出しコードで対応できなかった、より複雑なスレッドプールの使用が含まれていると推測しています。channel を処理するさまざまな方法を試しました。特に、呼び出し後に .ContinueWith を同期的に試みましたが、役に立ちませんでした。