基于任务的服务接口在天蓝色服务总线上

时间:2014-10-10 09:02:06

标签: c# wcf azure azure-servicebusrelay

在azure中使用net.tcp中继通信时,我们不断在客户端上获得合同/过滤器不匹配异常 只有在这些条件下才存在问题:

  • 使用azure net.tcp relay binding
  • 绑定设置为Hybid模式(在本地运行,以便服务可以相互联系)
  • 服务接口返回Tasks而不仅仅是数据合同

接口:

[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在调用后同步...但无济于事。

0 个答案:

没有答案