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