0

好的,我一直在深入研究 Fiddler 以深入了解这一点。事实证明,当我访问 IIS 8 站点与 IIS7 站点时,正在发送/接收 2 个请求。我已经使用完全相同的客户端完成了测试,并且只更改了服务器地址。所以除了服务器地址之外,一切都是一样的。

问题:为什么我看到 2 个对 IIS8 的请求,我该如何阻止它?

当我发送到 IIS 7 站点时——这就是我所看到的——只有一个数据包。 选项 /SERVER/api/messagetypeopt/97 HTTP/1.1 主机:(.net 4 - IIS7 服务器) 连接:keep-alive 访问控制请求方法:PUT 来源:null 用户代理:Mozilla/5.0(Windows NT 6.1 ; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.33 Safari/535.11 Access-Control-Request-Headers: accept, origin, content-type Accept: / Accept-Encoding: gzip,deflate,sdch Accept-Language : en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cache-Control: no-cache

HTTP/1.1 200 OK 服务器:Microsoft-IIS/7.0 X-Powered-By:ASP.NET 日期:星期一,2013 年 5 月 20 日 13:31:04 GMT 连接:关闭 内容长度:0

但是当我访问 IIS 8 站点时,我看到了数据包。!!我只做一个ajax请求!数据包 1 选项 /server/api/messagetypeopt/115 HTTP/1.1 主机:.NET 4.5 IIS 8 服务器连接:keep-alive 访问控制请求方法:PUT 来源:null 用户代理:Mozilla/5.0 (Windows NT 6.1 ; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.33 Safari/535.11 Access-Control-Request-Headers: accept, origin, content-type Accept: / Accept-Encoding: gzip,deflate,sdch Accept-Language : en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cache-Control: no-cache

HTTP/1.1 200 OK 服务器:Microsoft-IIS/8.0 X-Powered-By:ASP.NET Access-Control-Allow-Headers:Content-Type、Accept、X-Requested-With、x-csrftoken Access-Control-Allow-方法:GET、POST、OPTIONS、PUT Access-Control-Allow-Origin:* 日期:星期一,2013 年 5 月 20 日 13:26:30 GMT 连接:关闭 Content-Length:0

数据包 2 紧跟数据包 1 PUT /server/api/messagetypeopt/115 HTTP/1.1 主机:.NET 4.5 IIS 8 服务器连接:keep-alive 内容长度:84 接受:/ 来源:null 用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.33 Safari/535.11 Content-Type: application/json;charset=UTF-8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cache-Control: no-cache

HTTP/1.1 405 Method Not Allowed Cache-Control: private Allow: GET, HEAD, OPTIONS, TRACE Con​​tent-Type: text/html; charset=utf-8 服务器:Microsoft-IIS/8.0 X-Powered-By:ASP.NET Access-Control-Allow-Headers:Content-Type、Accept、X-Requested-With、x-csrftoken Access-Control-Allow-方法:GET、POST、OPTIONS、PUT 访问控制允许来源:* 日期:星期一,2013 年 5 月 20 日 13:26:30 GMT 连接:关闭内容长度:5332

为了完整起见,我添加了执行调用的 javascript 代码..这是从不同的域到服务器完成的(实际上来自我的本地 PC)

var mesType = {
            MessageTypeID: mID,
            typeName: mType,
            OptIns:isChecked,
            SenderID: SENDER_ID,
            BranchID: CURRENT_BRANCH
        };

        try {
            JSON.stringify(mesType);
        }
        catch (ext) {
            alert("error on creating json object");
        }
// PUT THIS BACK IN!! to get optIns
        $.support.cors = true;
        $.mobile.allowCrossDomainPages = true;
        $.mobile.loading('show');
        $.ajax({
            url:  MYSERVERNAME + 'api/messagetypeopt/' + mID,
            type: 'PUT',
            data: JSON.stringify(mesType),
            contentType: "application/json;charset=utf-8",
            jsonp: 'callback',
            crossDomain: true,
            success: function (data) {
                // WriteResponse(data);
                //alert('updated database for :' + mType + '=' + data);
            },
            error: function (x, y, z) {
                if (inApp == 1)
                {
                alert('THere was an error updating the server' + x + '\n' + y + '\n' + z);
                }
            },
            complete: function (a, b) {
                //alert('complete:' + a + '\n' + b);
               $.mobile.loading('hide');
            }
        });
4

1 回答 1

0

当浏览器被要求使用 GET、HEAD 或 POST 以外的方法发出跨域请求时,浏览器将首先发送一个 OPTIONS 请求,该请求带有相关方法的 Access-Control-Request-Method 标头。仅当服务器使用包含所需方法的 Access-Control-Allow-Methods 标头进行响应时,才会发出带有该方法的请求(在您的情况下为 PUT)。GET、HEAD 或 POST 之外的请求称为“预检”请求。Mozilla 有一篇关于 CORS 内部的相当详细的文章,以及关于预检请求的更多细节

要回答您的问题,根据您发布的内容,IIS7 似乎没有设置为正确处理跨域资源共享,因此不会以正确的标头响应浏览器以继续请求。IIS8 似乎被配置为处理 CORS 并以 Access-Control-Allow-Methods 进行响应,从而允许浏览器继续执行实际的 PUT 请求。将 IIS8 配置更改为不处理 CORS 请求应该会停止第二个请求。这可以通过删除应用程序的 web.config 文件中定义的所有以“Access-Control-Allow”开头的自定义标头来完成。如果您只想有一个请求并且实际上需要 PUT 请求才能到达服务器,我建议您为从同一域发出请求的页面提供服务,以完全避免 CORS。

于 2013-08-14T18:47:24.457 回答