Мы находимся в процессе переноса служб из локальной среды в Azure, и теперь мы размещаем унаследованную службу WCF - службу приложений Azure.Чтобы сделать его обратно совместимым с существующими клиентами, он должен быть доступен через {domainNameHere}.com/services
.
. Существуют также другие службы, которые должны быть доступны через тот же домен, например {domainNameHere}.com/api
.Мы настроили шлюз приложений Azure для маршрутизации запросов к различным службам приложений на основе путей запросов и установили {domainNameHere}.com
для указания IP-адреса шлюза приложений.
Это хорошо работает для всех служб, кромеслужба WCF.Он доступен в браузере по адресу https://{domainNameHere}.com/services/exports.svc
, но URI WSDL на этой странице показывают URI azurewebsites.net
вместо нашего пользовательского домена.Когда клиенты пытаются получить доступ к службе, они получают следующую ошибку:
System.ServiceModel.EndpointNotFoundException:
'There was no endpoint listening at https://{domainNameHere}.com/services/export.svc
that could accept the message. This is often caused by an incorrect address or SOAP
action. See InnerException, if present, for more details.'
Inner Exception
WebException: The remote server returned an error: (404) Not Found.
Мы пытались использовать useRequestHeadersForMetadataAddress
в конфигурации WCF, но безрезультатно.
Вот конфигурация WCFвсе в коде.URI endpoint
равен https://{domainNameHere}.com/services/exports.svc
.
public static void Configure<T>(ServiceConfiguration config, Uri endpoint) where T : class
{
// Configure service behavior
config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true, HttpsGetEnabled = true });
config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
var serviceCredential = config.Description.Behaviors.Find<ServiceCredentials>();
if (serviceCredential == null)
{
serviceCredential = new ServiceCredentials();
config.Description.Behaviors.Add(serviceCredential);
}
serviceCredential.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
serviceCredential.UserNameAuthentication.CustomUserNamePasswordValidator = new CredentialsValidator();
config.AddServiceEndpoint(typeof(T), GetBinding(), endpoint);
}
.