2

我花了很多时间阅读这里和其他各种网站上的所有各种帖子,并拥有以下代码:

    function post_cors(vars) {
        // cross domain AJAX posting - needs work to function in IE
        var successFunction = vars.success;
        var errorFunction = vars.error;
        var url = vars.url;
        var data = vars.data;

        if ($.browser.msie && window.XDomainRequest) {
            // CROSS DOMAIN AJAX FOR < IE10 (Doesn't work yet!)
            var xdr = new XDomainRequest();
            xdr.open("POST", url);
            xdr.send(JSON.stringify(data));
            xdr.onload = function () {
                // XDomainRequest doesn't provide responseXml, so if you need it:
                alert('Response: ' + xdr.responseText);
            };
        } else {
            $.ajax({ // proper AJAX for sensible browsers
                cache: false,
                dataType: "json",
                url: url,
                crossDomain: true,
                data: data,
                type: "POST",
                contentType: "application/json; charset=utf-8",
                success: function (data, textStatus, request) {
                    successFunction(data, textStatus, request);
                },
                error: function (data, textStatus, request) {
                    errorFunction(data, textStatus, request);
                }
            });
        };
    };

该函数调用如下:

post_cors({
    'success': function (data) {
         doStuffWithResponse()
     },
     'url': SOME WEB SERVICE,
     'data': "{ 'para1': '" + para1 + "', 'para2': '" + para2+ "' }"
}); 

这在 Chrome 和 Safari 等成熟的浏览器中发布了一个标准的跨域 AJAX 帖子,并且可以完美运行,包括在 iPad 等上。但是,我无法在 IE < 10 中使用它。

相关代码为:

var xdr = new XDomainRequest();
xdr.open("POST", url);
xdr.send(JSON.stringify(data));

SO 和其他人的各种线程建议这应该有效,包括这里: 如何使用 POST 方法在 XDR 中发送 JSON 数据

但它没有,我不知道为什么,尽管怀疑它与 POST 和数据有关。

所以我尝试了各种实验;

发布到不带参数的 Web 方法;

<WebMethod()> _
Public Function HelloWorld() As String
    Return "Hello World"
End Function

这在本地服务器上运行时似乎有效,但在添加到 Web 托管服务器时无效。我收到了200成功代码,但似乎无法通过 IE 控制台或 Fiddler 实际看到响应。无论如何,它似乎“离线”工作的事实可能是一个红鲱鱼......?

发布到带有参数的方法

<WebMethod()> _
Public Function TryThis(term as string) As String
    Return term
End Function

这总是http 500在 IE 中返回错误,但在成熟的浏览器中完美运行。

我在 Fiddle 或 IE 控制台中都没有收到错误信息。

后者将其显示为请求标头:

Key Value
Request POST http://samtest.thinkka.com/api/Sam_ScriptService.asmx/HelloWorld HTTP/1.1
Accept  */*
Origin  http://localhost:63238
Accept-Language en-GB
Accept-Encoding gzip, deflate
User-Agent  Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host    samtest.thinkka.com
Content-Length  108
Proxy-Connection    Keep-Alive
Pragma  no-cache

和响应标头:

Key Value
Response    HTTP/1.1 500 Internal Server Error
Cache-Control   private
Content-Type    text/html; charset=utf-8
Server  Microsoft-IIS/7.5
X-AspNet-Version    4.0.30319
X-Powered-By    ASP.NET
Access-Control-Allow-Origin *
Access-Control-Allow-Methods    GET, POST
Access-Control-Allow-Headers    Content-Type
Date    Tue, 08 Oct 2013 10:24:29 GMT
Content-Length  4826

Response Body为空,我无法阅读任何错误消息,因此不知道此错误发生的位置或原因。

我怀疑问题出在 POST 或表单数据上?

我尝试将数据作为对象发布,而不是 JSON.Stringified,但这不起作用,尽管我不希望它

Fiddler 似乎能够告诉我 IE 控制台不是这样的:

No Proxy-Authorization Header is present.
No Authorization Header is present.

两者都出现在“Auth”选项卡下,但在使用 Chrome 时也会出现在 Fiddler 中,这会返回肯定的响应。

我注意到 Chrome 发布了两次数据,在我所有的阅读过程中,我知道这是正确的(虽然现在不记得为什么), IE 没有,它只是在做第一次发布。我认为这是正确的,因为它是 AJAX 的功能?

我的 Web.Config 文件添加了正确的标题:

<customHeaders>
     <add name="Access-Control-Allow-Origin" value="*" />
     <add name="Access-Control-Allow-Methods" value="GET, POST" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>

显然,我知道这里的跨域问题,并遵循了我能找到的所有示例,但我现在被困住了......因此在这里发布。

请不要告诉我不要使用 ASMX 网络服务,或者不允许跨域发布,我现在需要一个解决方案!:-)

上面发布的链接中原始问题的作者建议他通过在服务器端响应中发现一个错误来解决他的问题,但是我的在除了旧版本的 IE 之外的所有东西都可以正常工作(顺便说一下,它可以在 IE10 中工作)所以我看不到它是服务器端错误 - 如果是,则无法获得任何信息,Error 500因此无法识别。

4

2 回答 2

2

首先,您需要修复您的代码,使其不会尝试在 IE10 中使用 XDomainRequest,它同时支持 CORS-for-XmlHttpRequest 和旧版 XDomainRequest 对象。

接下来,您需要更新服务器端代码,以便在请求缺少标头时它不会返回 HTTP/500 响应Content-Type: application/json。XDomainRequest不允许您设置该标头,并且您的服务器在决定如何解析请求正文时似乎正在期待它。

于 2013-10-08T16:51:24.170 回答
1

这有点过时了,但我发现 IE8 实际上以二进制流(或者可能只是纯文本)发送 POST 数据。当我发现这一点时,我在尝试解码表单 POST 时遇到问题。使用 ASP.NET C# 快速获取此内容的方法是:

string strContent = new System.Text.ASCIIEncoding().GetString(Context.Request.BinaryRead((int)Context.Request.InputStream.Length));

将此扩展到您的内心深处。

于 2014-02-13T11:25:07.447 回答