У меня есть служба WCF, которая находится за брандмауэром корпоративного класса, который выполняет преобразование как имени хоста, так и порта, например ::
https://ws.address.com/Service.svc -> https://serv.internal.com:44000/Service.svc
Служба защищена с помощью SSL-128 и требует сертификата клиента.
Поскольку внутреннее имя сервера недоступно извне брандмауэра, нам пришлось реализовать ServiceHostFactory для преобразования ссылок импорта WSDL и XSD, которые генерирует WCF:
public class MyCustomFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(
Type serviceType, Uri[] baseAddresses)
{
MyCustomHost customServiceHost =
new MyCustomHost(serviceType, baseAddresses);
return customServiceHost;
}
class MyCustomHost : ServiceHost
{
public MyCustomHost(Type serviceType,
params Uri[] baseAddresses)
: base(serviceType,
GetBaseAddresses(serviceType, baseAddresses))
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
}
private static Uri[] GetBaseAddresses(
Type serviceType, params Uri[] baseAddresses)
{
UriBuilder newBaseAddress = new UriBuilder();
newBaseAddress.Path = "/" + serviceType.ToString() +
".svc";
// from config
newBaseAddress.Host =
MyCustomSettings.ServiceBaseAddress;
if (baseAddresses.Length > 0)
{
newBaseAddress.Scheme = baseAddresses[0].Scheme;
}
return new Uri[] { newBaseAddress.Uri };
}
}
}
Вот проблема с этим: если служба не размещена на внутренней машине через порт SSL по умолчанию 443, мы получим ошибку:
Ни одна привязка протокола не соответствует данному адресу 'https://ws.address.com/Service.svc'. Связывания протокола настраиваются на уровне узла в конфигурации IIS или WAS.
Из переделок получается, что если мы изменим внутренний сервер для размещения службы на 443 или настроим брандмауэр для пересылки с 44000 на 44000, все будет работать. Это не варианты в нашей производственной среде.
Редактировать: Забыл упомянуть, мы пытались использовать IWsdlExportExtension для выравнивания WSDL, но это вызывало серьезные проблемы с генерацией прокси-кода в svcutil или VS2008, поэтому мы отказались идея.
Кто-нибудь знает как-нибудь обойти это? Я выдергиваю волосы!
Заранее спасибо!