Firefox/IE的PUT请求上的HTTP 400.适用于Chrome/Opera



有一个网站使用jquery在另一个域上调用WCF Web服务(Utlising CORS)。大多数方法都是GET方法,但也有一些PUT方法。

所有GET方法在所有浏览器上都能正常工作。PUT方法但仅适用于Chrome和Opera。对于Firefox和Internet Explorer,它们将导致HTTP 400 BAD REQUEST错误。我已经阅读了所有内容,并尝试了一切来更改网络服务的CORS设置,但都没有成功。

如果浏览器对某些人完美地工作,而对另一些人则不完美,那么它们发出PUT调用的方式会有什么不同呢?

作为参考,Web服务Global.asax文件如下所示:

 protected void Application_BeginRequest(object sender, EventArgs e)
    {
        //CORS ENABLED
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization, Origin, Content-Type, Accept, X-Requested-With");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }

与web.config相关的会话如下所示:

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
   <httpProtocol>
   </httpProtocol>
  </system.webServer>

有什么想法吗?

编辑:这就是jQuery请求:

       addAbs = function addAbs() {
        return $.ajax({
            type: 'PUT',
            url: Constructor.prototype.getServletURL(),
            contentType: "application/json; charset=utf-8",
            headers: {"Origin": "http://app-eservices.talentia-software.com"},
            data: JSON.stringify(newAbsence),
            timeout: GlobalContext.xhrTimeout,
            beforeSend: self.showLoadingDialog('')
        });

原来原因是AJAX请求指定了"charset=utf-8"的contentType,而不是"charset=utf-8",所以大写起了作用。作为参考,大写版本是正确的,但两者都应该有效。

对于自动大写的Chrome来说,这不是一个问题,但对于Firefox和其他没有更改大写的浏览器来说,该请求最终会出现HTTP 400 Bad request错误。显然WCF服务只能接受大写的版本,这很奇怪。除了更改AJAX请求之外,有人知道是否有其他方法可以让WCF服务接受小写版本吗?

最新更新