在IIS6下,jquery ajax发布到WCF服务的Post Data(方法参数)在IE中被删除(除非fiddler正在运行)

时间:2011-09-07 02:20:05

标签: c# asp.net wcf fiddler

现在一直在打扰这个问题。

在IIS6和Windows身份验证下,每当我尝试使用jquery发布到WCF服务时,都会调用并执行服务方法,但所有的post数据(方法参数)都为null。这似乎只发生在该机器上的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应用程序启用它。”看起来我陷入了困境。无论出于何种原因,在匿名访问下我的参数帖子设置都会丢失。如果该服务已经启动,我可以将文件更改为集成模式auth,一切都会正常工作。如果服务没有旋转(或者在应用程序池回收时丢失)并且它被设置为集成模式authenticatin,我失败并出现上述错误。叶加德!

1 个答案:

答案 0 :(得分:2)

原因似乎是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
  • 和工具/选项/高级/安全性:禁用“启用集成Windows身份验证(需要重新启动)”

据推测,Fiddler让它发挥作用,因为它以不同的方式进行NTLM握手。