Posting Cross Domain AJAX/XDomainRequest to Web Service

≯℡__Kan透↙ 提交于 2019-12-24 00:58:02

问题


I have spend a LOT of time reading through all the various posts here and on various other websites, and have the following code:

    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);
                }
            });
        };
    };

The function is called as follows:

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

This posts a standard Cross Domain AJAX post in grown up browsers like Chrome and Safari, and works perfectly, including on iPad etc. However, I cannot get the thing to work in IE < 10.

The relevant code is:

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

Various threads on SO and others suggest that this SHOULD work, including here: How to send JSON data in XDR using the POST method

But it doesn't, and I can't figure out why, although suspect it is to do with the POST and the Data.

So I have tried various experiments;

Posting to a Web Method with no parameters;

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

This appears to work when running on local servers, but does not when added to a web hosted server. I receive a 200 success code, but don't seem to be able to actually see the response, either through the IE console, or in Fiddler. The fact that it appears to work "offline" might be a red herring anyway...?

Posting to a Method which takes parameters

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

This ALWAYS returns a http 500 Error with IE, but works perfectly in grown up browsers.

I get no error information in either Fiddle or IE console.

The latter shows me this as Request Headers:

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

And Response Headers:

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 is empty, I cannot read any error message so have no idea where or why this error occurs.

I suspect the issues lies with the POST or with the Form Data?

I have tried posting data as an object, rather than JSON.Stringified, but that does't work, although, I wouldn't expect it to

All that Fiddler seems to be able to tell me that the IE console doesn't it:

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

Both appear under the "Auth" tab, but also appear in Fiddler when using Chrome, which returns a positive response.

I notice Chrome posts the data twice, during the course of all my reading I know that this is correct (although can't remember why at the moment), IE doesn't, it's only doing the first post. I think this is correct though as it is a function of AJAX?

My Web.Config file adds the proper headers:

<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>

Obviously, I am aware of the Cross Domain issues here, and have followed all the examples I can find, but I am stuck now... hence posting here.

Please don't tell me not to use an ASMX web service, or that Cross Domain posting is not allowed, I need a solution now! :-)

The author of the original question in the link posted above suggests that he solved his issue by finding an error on his server side response, but mine is working perfectly in everything except older versions of IE (it works in IE10 by the way) so I can't see it being a server side error - and if it is, getting no information on the Error 500 makes it impossible to identify.


回答1:


First, you need to fix your code so it doesn't try to use XDomainRequest inside IE10, which supports both CORS-for-XmlHttpRequest and the legacy XDomainRequest object.

Next, you need to update your server-side code so that it doesn't return a HTTP/500 response when the request lacks a Content-Type: application/json header. XDomainRequest doesn't allow you to set that header, and your server appears to be expecting it when deciding how to parse the request body.




回答2:


This my be a bit out of date, but I've found that IE8 actually sends the POST data in a binary stream (or maybe just plain text). I was having problems trying to decode the form POST when I found this out. A quick one-liner in ASP.NET C# to get this content is this:

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

Expand on this to your heart's content.



来源:https://stackoverflow.com/questions/19245449/posting-cross-domain-ajax-xdomainrequest-to-web-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!