jQuery Call to WebService returns “No Transport” e

2018-12-31 18:36发布

问题:

I have the following web service;

    [WebMethod]
    public string HelloWorld()
    {
        return \"Hello World\";
    }

It\'s stock standard with no alterations to the class decorators.

I have this jQuery method;

var webMethod = \"http://localhost:54473/Service1.asmx/HelloWorld\"; 

$.ajax({
    type: \"POST\",
    contentType: \"application/json; charset=utf-8\",
    data: \"{}\",  
    dataType: \"json\",
    url: webMethod,
    success: function(msg){ alert(msg.d); },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert(errorThrown);
          }
});

It\'s a post action because later on I need to post data to it.

When I execute the jQuery I get a \"No transport\" error returned.

One thing I should also mention is that the jQuery is stored in a simple HTML file on my machine and the WebService is running on my machine also.

There is no code behind on the HTML page it\'s simply a web page and not a c# project or anything.

Can anyone please point me in the right direction here?

回答1:

If your jQuery page isn\'t being loaded from http://localhost:54473 then this issue is probably because you\'re trying to make cross-domain request.

Update 1 Take a look at this blog post.

Update 2 If this is indeed the problem (and I suspect it is), you might want to check out JSONP as a solution. Here are a few links that might help you get started:

  • https://en.wikipedia.org/wiki/JSON
  • http://remysharp.com/2007/10/08/what-is-jsonp/
  • http://www.west-wind.com/weblog/posts/107136.aspx


回答2:

Add this: jQuery.support.cors = true;

It enables cross-site scripting in jQuery (introduced after 1.4x, I believe).

We were using a really old version of jQuery (1.3.2) and swapped it out for 1.6.1. Everything was working, except .ajax() calls. Adding the above line fixed the problem.



回答3:

I had the same error on a page, and I added these lines:

<!--[if lte IE 9]>
<script type=\'text/javascript\' src=\'//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js\'></script>
<![endif]-->

and it finally works for me ;) no more error in IE9.



回答4:

None of the proposed answers completely worked for me. My use case is slightly different (doing an ajax get to an S3 .json file in IE9). Setting jQuery.support.cors = true; got rid of the No Transport error but I was still getting Permission denied errors.

What did work for me was to use the jQuery-ajaxTransport-XDomainRequest to force IE9 to use XDomainRequest. Using this did not require setting jQuery.support.cors = true;



回答5:

i solve it by using dataType=\'jsonp\' at the place of dataType=\'json\'



回答6:

I too got this problem and all solutions given above either failed or were not applicable due to client webservice restrictions.

For this, I added an iframe in my page which resided in the client;s server. So when we post our data to the iframe and the iframe then posts it to the webservice. Hence the cross-domain referencing is eliminated.

We added a 2-way origin check to confirm only authorized page posts data to and from the iframe.

Hope it helps

<iframe style=\"display:none;\" id=\'receiver\' name=\"receiver\" src=\"https://iframe-address-at-client-server\">
 </iframe>

//send data to iframe
var hiddenFrame = document.getElementById(\'receiver\').contentWindow;
hiddenFrame.postMessage(JSON.stringify(message), \'https://client-server-url\');

//The iframe receives the data using the code:
window.onload = function () {
    var eventMethod = window.addEventListener ? \"addEventListener\" : \"attachEvent\";
    var eventer = window[eventMethod];
    var messageEvent = eventMethod == \"attachEvent\" ? \"onmessage\" : \"message\";
    eventer(messageEvent, function (e) {
        var origin = e.origin;
        //if origin not in pre-defined list, break and return
        var messageFromParent = JSON.parse(e.data);
        var json = messageFromParent.data;

        //send json to web service using AJAX   
        //return the response back to source
        e.source.postMessage(JSON.stringify(aJAXResponse), e.origin);
    }, false);
}


回答7:

I solved it simply by removing the domain from the request url.

Before: https://some.domain.com/_vti_bin/service.svc

After: /_vti_bin/service.svc