是什么原因导致Azure Service Bus Relay WCF服务抛出AddressAlreadyInUseException

时间:2014-10-17 21:33:42

标签: wcf azure-servicebusrelay

当我们尝试使用Azure Service Bus Relay地址和webHttpRelayBinding启动我们的WCF服务时,我们得到一个AddressAlreadyInUseException。

我们在这里使用示例:https://code.msdn.microsoft.com/Relayed-Messaging-Bindings-a6477ba0

除非使用以下代码创建中继,否则样本无法正常工作:

string connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

var tRelayExists = namespaceManager.RelayExistsAsync("Image");
if (!tRelayExists.Result)
{
    var t = namespaceManager.CreateRelayAsync(new RelayDescription("Image", RelayType.Http));
    Task.WaitAll(t);
    RelayDescription result = t.Result;
}

在Program.Main()中执行任何其他工作之前,您需要添加Azure Service Bus nuget包。然后,您需要使用Azure凭据更新名为Microsoft.ServiceBus.ConnectionString的appSettings下的App.config中的ConnectionString。

我们使用TCPViewer查看正在使用的端口,看不到任何冲突。在我们的实际项目中,我们尝试过webHttpRelayBinding和netTcpRelayBinding。在一天结束时,我们想要使用netTcpRelayBinding,以便我们可以使用DuplexChannels。

有关导致我们问题的原因的任何想法?我们是否遗漏了一些未记录的配置步骤?每个教程都使这看起来很简单,但我们发现每个教程都缺少一些关键步骤。如果我们错过了更多的步骤,我不会感到惊讶。

2 个答案:

答案 0 :(得分:3)

对于使用NamespaceManager创建的服务总线实体,我发现绑定IsDynamic属性需要设置为false。这将停止AddressAlreadyInUseException。

    var binding = new NetTcpRelayBinding();
    binding.IsDynamic = false;

这是我找到答案的地方: http://www.codit.eu/blog/2014/12/securing-azure-service-bus-relay-endpoints-with-sharedaccesssignatures/

答案 1 :(得分:2)

原来这里的解决方案很简单。如果使用NamespaceManager创建中继,则会得到AddressAlreadyInUseException。我想这就是为什么NamespaceManager没有记录在与继电器相关的任何地方。

只要您的命名空间在云中创建并且您的凭据设置正确,该示例就可以正常运行。在我的情况下,我需要使用SharedAccessSignature而不是SharedSecret。我在过去3天内发现的所有样本都使用了SharedSecret,直到上周五。

托管WCF服务时,它会自动在命名空间中创建中继路径。如果由于它已经存在而无法创建它,则会得到AddressAlreadyInUseException。只要您的信誉良好,那么一切都很愉快。