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

一段时间以来一直在打扰这个问题。

在IIS6和Windows身份validation下,每当我尝试使用jquery发布到WCF服务时,都会调用并执行service方法,但所有post数据(方法参数)都为null。 这似乎只发生在该机器上的IE8版本上。 这在Firefox中不会发生,当fiddler正在运行时(充当代理),这也不会发生。

此代码在IIS7下工作正常,并且似乎在IIS6匿名身份validation下正常工作。

post数据只是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定义如下:

                        

当然,服务文件是匿名访问(不是Windows身份validation)。

如果我们在匿名访问下运行所有​​东西,jquery会向服务传递适当的数据,方法会返回我们想要的内容,等等。如果我们在集成模式身份validation下运行但在客户端上有fiddler,则会发生同样的情况。

似乎Fiddler正在改变数据包以修复一个明显的缺陷 – 有问题,因为问题似乎只发生在机器的本地(排除使用wireshark / ethereal来嗅探数据包并确定确切的差异)。

此时,您提供的任何建议/信息都将非常有用。

更新2011-09-07:有趣的是,如果我联系该服务(并且asp.net将其旋转) – 我可以将服务从匿名访问更改为Windows集成身份validation。 虽然该服务已经启动并激活,但这实际上会使一切运行完美。 如果我等待IIS6将元数据库更改刷新到磁盘并运行IISreset(或回收应用程序池),它将失败。 它失败的原因是“此服务的安全设置需要’匿名’身份validation,但是没有为承载此服务的IIS应用程序启用它。” 看起来我陷入了困境。 无论出于何种原因,在匿名访问下我的参数post设置都会丢失。 如果该服务已经启动,我可以将文件更改为集成模式auth,一切都会正常工作。 如果服务没有旋转(或者在应用程序池回收时丢失)并且它被设置为集成模式authenticatin,我就会失败并出现上述错误。 叶加德!

原因似乎是IE遇到NTLM,然后它需要NTLM用于网站上的所有其他页面。 请参阅http://support.microsoft.com/?id=251404 “您无法将数据发布到非NTLM身份validation的网站”

建议的解决方法是,如果您在任何内容上启用NTLM,请在所有内容上启用NTLM。

替代解决方法是更改​​NTLM身份validation过程的客户端注册表黑客攻击。 从该链接:

  • HKEY_CURRENT_USER / Software / Microsoft / Windows / CurrentVersion / Internet Settings / DisableNTLMPreAuth REG_DWORD 1
  • 和工具/选项/高级/安全性:禁用“启用集成Windows身份validation(需要重新启动)”

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