WCF WebService / IIS Hosting & Configuration Issue Behind Брандмауэр

У меня есть простой веб-сервис WCF. Это размещается на IIS под веб-сайтом по умолчанию в нашем производственном домене. (локальный адрес: 10.10.20.100)

По умолчанию этот веб-сайт по умолчанию был установкой для "Всего Неприсвоенного" IP на Порте 80: однако, я заметил, что это вызвало Сервис WCF генерировать, это - WSDL с помощью серверов локальное имя DNS. т.е. все URIs в wsdl были

http://myserver.subdomain.domain.com/.../...

Это было бесполезно, поскольку я должен представить этот сервис сайтам, кто не знает о продуктивных средах внутренний DNS. И этот конкретный сервер не имеет внешнего Имени DNS. Просто внешний IP-адрес...

Я имел некоторый успех с изменением Настроек в IIS от "Всех Неприсвоенных"-> "10.10.20.100"

Это вызывает Сервис генерировать, это - WSDL с URIs

http://10.10.20.100/.../...

Это хорошо для других машин в субдомене и на других субдоменах, но это здесь, что я застреваю. Внешний IP-адрес (1.2.3.4) серверов отображается через через некоторый перевод NAT/PAT, таким образом, это не явно установка в Настройках IP серверов (т.е. он не показывает под Конфигурацией IP),

Таким образом, если я изменяю IP-адрес Веб-сайта Значения по умолчанию IIS от "Всех Неприсвоенных"-> "1.2.3.4", как я сделал для внутреннего адреса, тогда Сервис WCF просто возвращается с...

Плохой запрос (недопустимое имя узла)

И если я оставляю IIS Настроенным на Внутреннем IP-адресе и пытаюсь получить доступ к сервису через внешний IP-адрес, я добираюсь

No protocol binding matches the given address 
'http://1.2.3.4/TestService/Service.svc'. Protocol bindings are 
configured at the Site level in IIS or WAS configuration

Там какой-либо путь состоит в том, чтобы заставить IIS/WCF генерировать, это - URI WSDL с внешним IP-адресом, который явно не настроен на сервере?

Кто-то помогает мне прежде чем я dropkick WCF Services из окна.

28
задан Eoin Campbell 27 April 2009 в 11:49
поделиться

3 ответа

Это потому, что у вас не установлены заголовки хоста. Кажется, это очень распространенная проблема, я сталкиваюсь с этим все время. Там нет конфигурации для сгенерированного Uris, он ищет правильный адрес, изучая заголовок узла сайта. Даже если он находится в виртуальном каталоге, вам нужно перейти к родительскому, в вашем случае, к каталогу по умолчанию и добавить заголовок хоста.

Дайте мне знать, если вы не знаете, как это сделать.

заголовки вашего хоста не установлены. Кажется, это очень распространенная проблема, я сталкиваюсь с этим все время. Там нет конфигурации для сгенерированного Uris, он ищет правильный адрес, изучая заголовок узла сайта. Даже если он находится в виртуальном каталоге, вам нужно перейти к родительскому, в вашем случае, к каталогу по умолчанию и добавить заголовок хоста.

Дайте мне знать, если вы не знаете, как это сделать.

заголовки вашего хоста не установлены. Кажется, это очень распространенная проблема, я сталкиваюсь с этим все время. Там нет конфигурации для сгенерированного Uris, он ищет правильный адрес, изучая заголовок узла сайта. Даже если он находится в виртуальном каталоге, вам нужно перейти к родительскому, в вашем случае, к каталогу по умолчанию и добавить заголовок хоста.

Дайте мне знать, если вы не знаете, как это сделать.

8
ответ дан 28 November 2019 в 03:55
поделиться

Must it be an IP address and not an FQDN? By swapping to an FQDN and setting that in the host headers for the site, then binding to it via

cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs set W3SVC/1/ServerBindings ":80:hostname.example.com"

then recycling the app pool will then produce that host name in the generated WSDL. You get benefits with that - you can setup an internal DNS which resolves that FQDN to the internal IP, and an external DNS which resolves to your firewall IP, then the same system will work without any changes.

1
ответ дан 28 November 2019 в 03:55
поделиться

Я мог бы предотвратить насилие ниндзя ... если я понимаю твою проблему ... Вы можете вручную указать полный адрес, который служба должна использовать в web.config, вместо того, чтобы ServiceHost выяснил это для вас. Вам необходимо установить базовый адрес вашей службы:

 <service behaviorConfiguration="Behaviour1" name="Api.Poll">
    <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding"
      contract="Api.IPoll" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://www.mydomain.com/Api" />
        <add baseAddress="http://10.10.20.30/Api" />
      </baseAddresses>
    </host>
  </service>

Используя этот метод, ваша служба должна принять указанный базовый адрес плюс имя службы с дополнительным адресом конечной точки, если он у вас есть. Кроме того, вам нужно будет использовать пользовательский ServiceHostFactory для программного задания базового адреса. См. Ниже:

    public class ServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {                        
        ServiceHost host;

        host = new ServiceHost(serviceType, baseAddresses[0]);

        return host;
    }

Наконец, после создания класса ServiceHostFactory его необходимо подключить к службе, отредактировав разметку в файле .svc:

<%@ ServiceHost Language="C#" Debug="true" Service="Api.Poll" Factory="Api.ServiceHostFactory" CodeBehind="Poll.svc.cs" %>
1
ответ дан 28 November 2019 в 03:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: