我必须设置一个必须可用于其他平台(android、iOS)的 Azure 服务。这就是为什么我尝试使用 http 或 https 协议而不是 sb(服务总线)协议来设置它(参考:服务总线绑定,最后一段)。
不幸的是,服务在初始化时抛出异常:
"HTTP could not register URL http://+:80/ServiceBusDefaultNamespace/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details)."
WorkerRole中的服务初始化代码为:
private void InitailizeService()
{
Trace.WriteLine("Initializing service");
try
{
var serviceAddress = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ServiceAddress");
var protocol = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.Protocol");
string keyName = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ServiceKeyName");
string sharedAccessKey = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ServiceSharedAccessKey");
Uri uri = new Uri(protocol + "://" + serviceAddress + "/ServiceBusDefaultNamespace");
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Http;
_host = new ServiceHost(typeof(WorkerRoleService), uri);
TokenProvider tp = null;
if (!String.IsNullOrEmpty(keyName))
{
tp = TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, sharedAccessKey);
}
var sharedSecretServiceBusCredential = new TransportClientEndpointBehavior(tp);
ContractDescription contractDescription = ContractDescription.GetContract(typeof(IInstalSoftCloudService), typeof(WorkerRoleService));
ServiceEndpoint serviceEndPoint = new ServiceEndpoint(contractDescription);
serviceEndPoint.Address = new EndpointAddress(uri);
Binding binding;
switch (protocol)
{
case "sb":
binding = new NetTcpRelayBinding { TransferMode = TransferMode.Streamed, MaxReceivedMessageSize = 1048576000, MaxBufferSize = 10485760, MaxConnections = 200 };
break;
case "http":
case "https":
binding = new WebHttpRelayBinding { TransferMode = TransferMode.Streamed, MaxReceivedMessageSize = 1048576000, MaxBufferSize = 10485760 };
break;
default:
throw new NotSupportedException("Protocol not supported: " + protocol);
}
serviceEndPoint.Binding = binding;
serviceEndPoint.Behaviors.Add(sharedSecretServiceBusCredential);
_host.Description.Endpoints.Add(serviceEndPoint);
_host.Open();
Trace.WriteLine("Service initialization completed");
}
catch (Exception e)
{
Trace.WriteLine("Service initialization failed.\r\n" + e.Message);
throw;
}
}
ServiceConfiguration.Cloud.cscfg 中的设置为:
<Setting name="Microsoft.ServiceBus.ServiceAddress" value="<my namespace here>.servicebus.windows.net" />
<Setting name="Microsoft.ServiceBus.ServiceKeyName" value="RootManageSharedAccessKey" />
<Setting name="Microsoft.ServiceBus.ServiceSharedAccessKey" value="<my key here>" />
<Setting name="Microsoft.ServiceBus.Protocol" value="http" />
当设置中的协议更改为“sb”时,上面的代码可以正常工作。