在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绑定在封面下工作的方式涉及一些更复杂的线程池使用,我还没有在我的调用代码中设法满足。我已经尝试了各种处理频道的方法,特别是通过尝试.Continue在调用后同步...但无济于事。