现在一直在打扰这个问题。
在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,我失败并出现上述错误。叶加德!
答案 0 :(得分:2)
原因似乎是IE遇到NTLM,然后它需要NTLM用于网站上的所有其他页面。见http://support.microsoft.com/?id=251404 “您无法将数据发布到非NTLM身份验证的网站”
建议的解决方法是,如果您对任何内容启用NTLM,请在所有内容上启用NTLM。
替代解决方法是更改NTLM身份验证过程的客户端注册表黑客攻击。从那个链接:
据推测,Fiddler让它发挥作用,因为它以不同的方式进行NTLM握手。