Azure 服务总线主题超时异常
Azure Service Bus Topic Timeout exception
我正在使用此博客 post 上提供的代码为 Azure 服务总线主题构建 POC: http://blogs.msdn.com/b/tomholl/archive/2011/10/09/using-service-bus-topics-and-subscriptions-with-wcf.aspx 但是,我收到以下错误。
System.TimeoutException: The request has timed out after 00:00:00 milliseconds. The successful completion of the request cannot be determined. Additional queries should be made to determine whether or not the operation has succeeded.
我已按照 Link 完成所有操作。这是我的代码,我在这一行收到错误:((IChannel)clientChannerl).Open();
var accountEventLog = new AccountEventLog()
{
AccountId = 123,
EventType = "BE",
Date = DateTime.Now
};
ChannelFactory<IAccountEventNotification> factory = null;
try
{
factory = new ChannelFactory<IAccountEventNotification>("Subscribers");
var clientChannerl = factory.CreateChannel();
((IChannel)clientChannerl).Open();
using (new OperationContextScope((IContextChannel)clientChannerl))
{
var bmp = new BrokeredMessageProperty();
bmp.Properties["AccountId"] = accountEventLog.AccountId;
bmp.Properties["EventType"] = accountEventLog.EventType;
bmp.Properties["Date"] = accountEventLog.Date;
OperationContext.Current.OutgoingMessageProperties.Add(BrokeredMessageProperty.Name, bmp);
clientChannerl.onEventOccurred(accountEventLog);
}
((IChannel)clientChannerl).Close();
factory.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
这是我的配置设置
<behaviors>
<endpointBehaviors>
<behavior name="securityBehavior">
<transportClientEndpointBehavior>
<tokenProvider>
<sharedSecret issuerName="RootManageSharedAccessKey" issuerSecret="Shared Key Here" />
</tokenProvider>
</transportClientEndpointBehavior>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<netMessagingBinding>
<binding name="messagingBinding" sendTimeout="00:03:00" receiveTimeout="00:03:00"
openTimeout="00:03:00" closeTimeout="00:03:00" sessionIdleTimeout="00:01:00"
prefetchCount="-1">
<transportSettings batchFlushInterval="00:00:01" />
</binding>
</netMessagingBinding>
</bindings>
<client>
<endpoint name="Subscribers"
address="sb://Namespace/topicname"
binding="netMessagingBinding"
bindingConfiguration="messagingBinding"
contract="My Contract"
behaviorConfiguration="securityBehavior" />
</client>
任何帮助将不胜感激
我能够解决这个问题。但是,我将描述我在整个练习中学到的东西。
- 行为中添加的令牌提供程序用于使用 ACS(Active Directory 服务)进行服务总线身份验证
- 默认情况下,使用 Azure 门户创建的命名空间不会创建 ACS endpoint/ACS 身份验证。当您创建命名空间时,默认情况下它只会创建 SAS(共享访问签名)。
- 要通过 SAS 验证您的 wcf 调用,请使用此令牌提供程序:<sharedAccessSignature keyName="RootManageSharedAccessKey" key="key " />
如果您想使用 ACS 身份验证,请使用 Azure Power Shell 创建命名空间。以下是创建启用 ACS 身份验证的命名空间的 PS 命令:
New-AzureSBNamespace "Namespace" "East US" -CreateACSNamespace $true -NamespaceType Messaging
因此,为了解决我的问题,我使用了上述第 3 点,它开始起作用了。
另一件需要注意的事情是,是否有人不小心在您的 App.config 或 Web.config 中启用了代理?这会在发送时产生类似的异常。
查找类似以下内容:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
</defaultProxy>
</system.net>
我正在使用此博客 post 上提供的代码为 Azure 服务总线主题构建 POC: http://blogs.msdn.com/b/tomholl/archive/2011/10/09/using-service-bus-topics-and-subscriptions-with-wcf.aspx 但是,我收到以下错误。
System.TimeoutException: The request has timed out after 00:00:00 milliseconds. The successful completion of the request cannot be determined. Additional queries should be made to determine whether or not the operation has succeeded.
我已按照 Link 完成所有操作。这是我的代码,我在这一行收到错误:((IChannel)clientChannerl).Open();
var accountEventLog = new AccountEventLog()
{
AccountId = 123,
EventType = "BE",
Date = DateTime.Now
};
ChannelFactory<IAccountEventNotification> factory = null;
try
{
factory = new ChannelFactory<IAccountEventNotification>("Subscribers");
var clientChannerl = factory.CreateChannel();
((IChannel)clientChannerl).Open();
using (new OperationContextScope((IContextChannel)clientChannerl))
{
var bmp = new BrokeredMessageProperty();
bmp.Properties["AccountId"] = accountEventLog.AccountId;
bmp.Properties["EventType"] = accountEventLog.EventType;
bmp.Properties["Date"] = accountEventLog.Date;
OperationContext.Current.OutgoingMessageProperties.Add(BrokeredMessageProperty.Name, bmp);
clientChannerl.onEventOccurred(accountEventLog);
}
((IChannel)clientChannerl).Close();
factory.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
这是我的配置设置
<behaviors>
<endpointBehaviors>
<behavior name="securityBehavior">
<transportClientEndpointBehavior>
<tokenProvider>
<sharedSecret issuerName="RootManageSharedAccessKey" issuerSecret="Shared Key Here" />
</tokenProvider>
</transportClientEndpointBehavior>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<netMessagingBinding>
<binding name="messagingBinding" sendTimeout="00:03:00" receiveTimeout="00:03:00"
openTimeout="00:03:00" closeTimeout="00:03:00" sessionIdleTimeout="00:01:00"
prefetchCount="-1">
<transportSettings batchFlushInterval="00:00:01" />
</binding>
</netMessagingBinding>
</bindings>
<client>
<endpoint name="Subscribers"
address="sb://Namespace/topicname"
binding="netMessagingBinding"
bindingConfiguration="messagingBinding"
contract="My Contract"
behaviorConfiguration="securityBehavior" />
</client>
任何帮助将不胜感激
我能够解决这个问题。但是,我将描述我在整个练习中学到的东西。
- 行为中添加的令牌提供程序用于使用 ACS(Active Directory 服务)进行服务总线身份验证
- 默认情况下,使用 Azure 门户创建的命名空间不会创建 ACS endpoint/ACS 身份验证。当您创建命名空间时,默认情况下它只会创建 SAS(共享访问签名)。
- 要通过 SAS 验证您的 wcf 调用,请使用此令牌提供程序:<sharedAccessSignature keyName="RootManageSharedAccessKey" key="key " />
如果您想使用 ACS 身份验证,请使用 Azure Power Shell 创建命名空间。以下是创建启用 ACS 身份验证的命名空间的 PS 命令:
New-AzureSBNamespace "Namespace" "East US" -CreateACSNamespace $true -NamespaceType Messaging
因此,为了解决我的问题,我使用了上述第 3 点,它开始起作用了。
另一件需要注意的事情是,是否有人不小心在您的 App.config 或 Web.config 中启用了代理?这会在发送时产生类似的异常。
查找类似以下内容:
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888" usesystemdefault="false" />
</defaultProxy>
</system.net>