0

在 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 同步……但无济于事。

4

0 回答 0