Сбой веб-ссылки с базовой аутентификацией - PullRequest
1 голос
/ 15 июня 2011

У меня есть веб-сервис, созданный с использованием Apache CXF, и два клиента .NET, использующие веб-ссылки (не сервисные ссылки).Клиент Compact Framework работает, но настольный клиент .NET 4.0 работает только при разговоре с localhost.Вот настройки клиента:

        var client = new Permission.Permission();
        client.Credentials = new NetworkCredential(username, password);
        client.PreAuthenticate = true;
        client.Url = url + "/Permission";

Если url равно http://localhost:8080/, вызов завершается успешно, но если это http://127.0.0.1:8080, вызов завершается с ошибкой 401. По какой-то причине сгенерированный код клиента останавливается наответ 401 и не отправляет имя пользователя и пароль.

Редактировать: Я нашел виновника, но не знаю окончательного ответа. Visual Studio вставил этот разделв файл app.config:

<applicationSettings>
    <MyService.Properties.Settings>
        <setting name="MyService_Permission_Permission" serializeAs="String">
            <value>http://localhost:8080/api/Permission</value>
        </setting>
    </MyService.Properties.Settings>
</applicationSettings>

Аутентификация работает, если я изменю app.config на соответствующий URL-адрес.Итак, мой ключевой вопрос: как мой код дает сгенерированному клиенту команду переключиться на другой экземпляр веб-службы, не редактируя app.config и не перезапускаясь?

Для получения дополнительной информации, когда я перемещаю код службы вдругая машина Wireshark показывает следующую последовательность:

  1. Служба для клиента:

     HTTP/1.1 100 Continue\r\n
    
  2. Клиент для службы:

     POST /api/Permission HTTP/1.1
     User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.225)
     VsDebuggerCausalityData: uIDPo8B4pxEyITVOlb6i18R2juMAAAAACwClY0YyykuVhoiZKG7oEPZ1kukkB6NLnxx6RVnHjT8ACQAA
     Content-Type: text/xml; charset=utf-8
     SOAPAction: ""
     Host: xxxxxx:8080
     Content-Length: 307
     Expect: 100-continue
    
  3. Служба клиенту:

     HTTP/1.1 401 Unauthorized
     Content-Length: 0
     content-type: text/xml; charset=utf-8
     Expect: 100-continue
     Host: xxx:8080
     SOAPAction: ""
     User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.225)
     VsDebuggerCausalityData: uIDPo8B4pxEyITVOlb6i18R2juMAAAAACwClY0YyykuVhoiZKG7oEPZ1kukkB6NLnxx6RVnHjT8ACQAA
     WWW-Authenticate: Basic realm=realm
     Server: Jetty(6.1.25)
    
  4. В этот момент клиент должен повторить POST с добавленным заголовком базовой аутентификации, но вместо этого он останавливается.

1 Ответ

0 голосов
/ 17 июня 2011

Я нашел ответ. Имя хоста localhost является магией в веб-справочнике. Внутри сгенерированного кода живет эта функция:

    private bool IsLocalFileSystemWebService(string url) {
        if (((url == null) 
                    || (url == string.Empty))) {
            return false;
        }
        System.Uri wsUri = new System.Uri(url);
        if (((wsUri.Port >= 1024) 
                    && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) {
            return true;
        }
        return false;
    }
}

Изменяя мой app.config по умолчанию на 127.0.0.1, я обхожу специальное поведение для аутентификации локальных веб-сервисов.

Мораль этой истории: не используйте localhost в URL при разработке клиента веб-ссылки на локальный экземпляр службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...