在IIS6下,Post Data(方法参数)在jquery ajax Post到WCF服务在IE中是空的(除非fiddl

本文关键字:Post IE 服务 fiddl 除非 WCF jquery IIS6 Data 方法 ajax | 更新日期: 2023-09-27 18:07:42

这个问题已经讨论了一段时间了

在IIS6和windows身份验证下,每当我尝试使用jquery发送到WCF服务时,服务方法被调用并执行,但所有的发送数据(方法参数)都是空的。这似乎只发生在该机器上的IE8版本上。这在Firefox中不会发生,奇怪的是,当fiddler运行时(作为代理)也不会发生。

此代码在IIS7下运行良好,在IIS6匿名身份验证下运行良好。

post data只是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。配置定义如下:

<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应用程序未启用该身份验证"。"。看来我进退两难了。无论出于什么原因,在匿名访问下,我的论点帖子设置丢失了。如果服务已经启动,我可以将文件更改为集成模式授权,一切都会正常工作。如果服务没有启动(或者在应用程序池回收时丢失),并且它被设置为集成模式身份验证,我就会失败,并出现上面提到的错误。你们迦得!

在IIS6下,Post Data(方法参数)在jquery ajax Post到WCF服务在IE中是空的(除非fiddl

原因似乎是一旦IE遇到NTLM,它就会要求网站上所有其他页面都使用NTLM。参见http://support.microsoft.com/?id=251404"无法将数据发布到非ntlm认证的网站"

建议的解决方法是,如果你在任何东西上启用NTLM,那么在所有东西上启用NTLM。

另一种解决方法是修改NTLM认证过程的客户端注册表。从该链接:

  • HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings/DisableNTLMPreAuth REG_DWORD 1
  • 和Tools/Options/Advanced/Security: disable "Enable Integrated Windows Authentication(需要重启)"