Я размещаю службу WCF в рабочей роли Azure.
Служба доступна по общедоступному доменному имени экземпляра облачных служб (myservice.cloudapp.net), однако ссылки на WSDL и URL-адреса внутри WSDL вместо этого используют внутренний IP-адрес, к которому нельзя получить доступ извне. Таким образом, такие инструменты, как Добавить ссылку на службу и WCFTestClient.exe, не работают так гладко, как должны, потому что они пытаются получить доступ к внутреннему IP-адресу.
Я создаю свою службу со следующим кодом:
RoleInstanceEndpoint endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["MyServiceEndpoint"];
string endpointAddr = String.Format( "http://{0}/MyInteropService", endpoint.IPEndpoint );
this.serviceHost = new ServiceHost( typeof( MyInteropService ), new Uri( endpointAddr ) );
BasicHttpBinding binding = new BasicHttpBinding();
serviceHost.AddServiceEndpoint( typeof( IMyInteropService ), binding, "" );
ServiceMetadataBehavior smb = new ServiceMetadataBehavior
{
HttpGetEnabled = true,
HttpsGetEnabled = true,
};
serviceHost.Description.Behaviors.Add( smb );
//serviceHost.AddServiceEndpoint( ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); It does not matter whether I include this line or not.
serviceHost.Open();
Что я делаю неправильно? Как настроить службу для использования общедоступного доменного имени в WSDL?
ОБНОВЛЕНИЕ: ответ Питера помог мне решить проблему, в моем случае мне нужно было только добавить поведение UseRequestHeadersForMetadataAddressBehavior
к службе, после чего WSDL использовал имя общедоступного домена (я думаю, теперь он использует домен, клиент отправляет запрос).
Таким образом, полный рабочий код выглядит следующим образом:
RoleInstanceEndpoint endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["MyServiceEndpoint"];
string endpointAddr = String.Format( "http://{0}/MyInteropService", endpoint.IPEndpoint );
this.serviceHost = new ServiceHost( typeof( MyInteropService ), new Uri( endpointAddr ) );
BasicHttpBinding binding = new BasicHttpBinding();
serviceHost.AddServiceEndpoint( typeof( IMyInteropService ), binding, "" );
ServiceMetadataBehavior smb = new ServiceMetadataBehavior
{
HttpGetEnabled = true,
HttpsGetEnabled = true,
};
serviceHost.Description.Behaviors.Add( smb );
// This part solved the problem.
var requestHeaderBehavior = new UseRequestHeadersForMetadataAddressBehavior();
this.serviceHost.Description.Behaviors.Add(requestHeaderBehavior);
serviceHost.Open();
UseRequestHeadersForMetadataAddressBehavior
в сервис, и теперь он работает, остальные части кода добавлять не пришлось. 11.11.2014