jQuery调用Web服务返回“无传输”错误

时间:2011-03-09 03:48:19

标签: jquery ajax web-services

我有以下网络服务;

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

它是库存标准,没有对类装饰器进行任何更改。

我有这个jQuery方法;

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

这是一个后期操作,因为稍后我需要将数据发布到它。

当我执行jQuery时,我收到了“No transport”错误。

我还应该提到的一点是,jQuery存储在我的机器上的一个简单的HTML文件中,而且WebService也在我的机器上运行。

HTML页面上没有任何代码,它只是一个网页,而不是一个c#项目或任何东西。

有谁能请我指出正确的方向?

8 个答案:

答案 0 :(得分:252)

添加:jQuery.support.cors = true;

它支持jQuery中的跨站点脚本(我相信在1.4x之后引入)。

我们使用的是旧版本的jQuery(1.3.2)并将其换成1.6.1。一切都在工作,除了.ajax()调用。添加以上行修复了问题。

答案 1 :(得分:95)

如果您的jQuery页面未从http://localhost:54473加载,则此问题可能是因为您尝试进行跨域请求。

更新1 看看this blog post

更新2 如果这确实是问题(我怀疑它是),您可能想要检查JSONP作为解决方案。以下是一些可能有助于您入门的链接:

答案 2 :(得分:26)

我在页面上遇到了同样的错误,并添加了这些行:

<!--[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]-->

它最终适用于我;)IE9中没有更多错误。

答案 3 :(得分:7)

所提出的答案都不适合我。我的用例略有不同(在IE9中执行ajax获取S3 .json文件)。设置jQuery.support.cors = true;摆脱了No Transport错误,但我仍然遇到Permission denied错误。

对我有用的是使用jQuery-ajaxTransport-XDomainRequest强制IE9使用XDomainRequest。使用此功能不需要设置jQuery.support.cors = true;

答案 4 :(得分:6)

我使用dataType ='jsonp'来解决它 在dataType ='json'的地方

答案 5 :(得分:0)

我也遇到了这个问题,由于客户端的网络服务限制,上面给出的所有解决方案都失败了或者不适用。

为此,我在我的页面中添加了一个iframe,它位于客户端的服务器中。因此,当我们将数据发布到iframe和iframe然后将其发布到网络服务时。因此,消除了跨域引用。

我们添加了双向来源检查,以确认只有授权页面向iframe发送数据和从iframe发布数据。

希望有所帮助

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

答案 6 :(得分:0)

对我来说,这是一个完全不同的故事。
由于此页面在搜索引擎上的排名很高,因此我也应该在此添加案例和解决方案。

我用jquery自己构建了webpack,只选择了我使用的模块。该ajax总是失败,并以“无传输”消息作为唯一线索。

经过长时间的调试,结果发现问题XMLHttpRequest是可插入jquery的,并且默认情况下不包括在内。

您必须明确包含jquery/src/ajax/xhr文件,才能使ajax在浏览器中正常工作。

答案 7 :(得分:-1)

我只是通过从请求网址中删除域来解决它。

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

After: /_vti_bin/service.svc