В IIS6 Post Data (аргументы метода) в jquery ajax post для службы WCF обнуляются в IE (если не запущен fiddler) - PullRequest
2 голосов
/ 07 сентября 2011

Некоторое время назад об этой проблеме били.

При проверке подлинности IIS6 и Windows всякий раз, когда я пытаюсь использовать jquery для публикации в службу WCF, вызывается и выполняется метод службы, но все сообщенияданные (аргументы метода) равны нулю.Похоже, это происходит только в версии IE8, установленной на этой машине.Этого не происходит в Firefox, и это также не происходит, как ни странно, при работе fiddler (действующего в качестве прокси-сервера).

Этот код отлично работает в IIS7 и, похоже, работает нормально при анонимной аутентификации IIS6.

Данные публикации - это просто JSON.

$.callService('GetCurrentTemplates', pagingData, GetCurrentTemplateSucceeded, ServiceFailed);

$.callService = function (url, data, successHandler, failHandler) {
    var applicationUrl = $("#hdApplicationUrl").val();
    $.ajax({
        type: "POST", //GET or POST or PUT or DELETE verb
        url: applicationUrl + "Service.svc/" + url, // Location of the service
        data: $.jsonSerialize(data), //Data sent to server
        contentType: "application/json; charset=utf-8", // content type sent to server
        dataType: "json", //Expected data format from server
        processdata: true, //True or False
        success: function (result) {
            if (result == null) {
                var resultObj = new Object();
                resultObj.status = 401;
                resultObj.statusText = 'Unauthorized';
                $.showError(resultObj);
                return;
            }
            if (successHandler != null && successHandler != undefined)
                successHandler(result);
        }, // When success
        error: function (result) {
            $.showError(result);
        } // When Service call fails
    });

Служба WCF была разработана для использования следующих определений WebServiceHostFactory и web.config:

<services>
  <service name="Company.Core.TemplateService" behaviorConfiguration="templateWcfBehavior">
    <endpoint address="" binding="webHttpBinding" bindingConfiguration="templateWebHttpBinding" behaviorConfiguration="jsonEndpointBehavior" contract="Company.Core.ITemplateService" />
  </service>
</services>

<behaviors>
    <endpointBehaviors>
        <behavior name="jsonEndpointBehavior">
            <webHttp />
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="templateWcfBehavior">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="false" />         
        </behavior>
    </serviceBehaviors>
</behaviors>

<webHttpBinding>
<binding name="templateWebHttpBinding" maxReceivedMessageSize="2147483647">
  <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</webHttpBinding>

СлужбаФайл, конечно, находится под анонимным доступом (не аутентификацией Windows).

Если мы запускаем -everything- под анонимным доступом, jquery передает службе соответствующие данные, методы возвращают то, что нам нужно, и т. д.То же самое происходит, если мы выполняем аутентификацию в интегрированном режиме, но у нас на клиенте есть fiddler.

Похоже, что Fiddler изменяет пакеты, чтобы исправить очевидный дефект - возникла проблема, поскольку проблема, кажется, возникает только локально.машина (исключающая использование wireshark / ethereal для перехвата пакетов и определения точных различий).

На этом этапе любой совет / информация, которую вы можете предложить, будет чрезвычайно полезен.

Обновление 2011-09-07: Достаточно интересно, если я обращаюсь в службу поддержки (и asp.net вращаетсяэто) - я могу затем изменить службу с анонимного доступа на встроенную проверку подлинности Windows.Хотя служба уже запущена и активирована, на самом деле все работает идеально.Если я подожду, пока IIS6 сбросит изменения метабазы ​​на диск и запустит IISreset (или перезапустит пул приложений), произойдет сбой.Причина сбоя заключается в том, что «параметры безопасности для этой службы требуют« анонимной »аутентификации, но она не включена для приложения IIS, в котором размещена эта служба».Похоже, я в затруднительном положении.По какой-то причине при анонимном доступе мои настройки сообщения аргумента теряются.Если служба уже запущена, я могу изменить файл на интегрированный режим аутентификации, и все будет работать.Если служба не запускается (или теряется при перезапуске пула приложений) и для нее установлен режим аутентификации в интегрированном режиме, произойдет сбой с ошибкой, отмеченной выше.О Боже!

1 Ответ

2 голосов
/ 08 сентября 2011

Причина в том, что IE сталкивается с NTLM, а затем требует NTLM для всех других страниц сайта.См. http://support.microsoft.com/?id=251404 «Вы не можете публиковать данные на веб-узле, не прошедшем проверку подлинности NTLM» *

Рекомендуемый обходной прием: если вы включаете NTLM для чего-либо, включаете NTLM для всех.

АльтернативаОбходной путь - это хаки реестра на стороне клиента, которые изменяют процесс аутентификации NTLM.По этой ссылке:

  • HKEY_CURRENT_USER / Программное обеспечение / Microsoft / Windows / CurrentVersion / Настройки Интернета / DisableNTLMPreAuth REG_DWORD 1
  • и Инструменты / Параметры / Дополнительно / Безопасность: отключить «Включить встроенную проверку подлинности Windows(требуется перезагрузка) "

Предположительно, Fiddler заставляет его работать, потому что он выполняет рукопожатие NTLM по-другому.

...