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