jQuery调用WebService返回“无传输”错误


163

我有以下网络服务;

    [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页面上没有代码,它只是一个网页,而不是ac#项目或其他任何代码。

有人可以在这里指出正确的方向吗?


您可以仅使用浏览器访问Web服务吗?
Avitus

抱歉,我没有注意到这是另一篇文章(我编辑了这篇文章,以为是我自己的),我必须在自己的文章中单击指向该文章的超链接。真的很抱歉帖子拥有者= \
Erick Garcia

$ .support.cors = true; 如果您的端点启用了CORS(它使用Access-Control-Allow-Origin标头等正确响应),则此代码行将说服jQuery在IE8中进行跨源请求。我刚刚碰到过这个问题,希望它可以为您节省一些时间和头痛。
杰里米·赫特

Answers:


95

如果未从中加载jQuery页面,http://localhost:54473则此问题可能是因为您试图发出跨域请求。

更新1 查看此博客文章

更新2 如果这确实是问题所在(我怀疑是问题所在),则您可能希望签出JSONP作为解决方案。以下是一些可能有助于您入门的链接:


4
是的,它可能与安全性有关。
thenengah 2011年

3
它不必是localhost:54473,而必须是相同的域。
jcolebrand

7
@drachenstern嗯,我一直以为(似乎总是记得在读书)方案,主机端口必须相同。这个这个这个似乎支持了我思考组成同一域的方式。
no.good.at.coding

@drachenstern很高兴能为您提供帮助!所有这些网络内容都很棘手-每天都需要学习一些新知识:)
no.good.at.coding

1
@griegs很好听,但请注意您实际上并没有解决问题-这仅在环境允许跨域请求的情况下有效,因为您仅删除了jQuery设置的安全措施。如果您的浏览器不允许,设置此属性将对您无济于事。我建议现在付出一些努力来实现JSONP。至少,您可能想尝试看看强制jQuery跨域支持是否与计划支持的所有浏览器一起使用。我也无法评论您以后可能遇到的其他问题!
no.good.at.coding

253

添加此: jQuery.support.cors = true;

它启用了jQuery中的跨站点脚本(我相信1.4x之后才引入)。

我们使用的是jQuery(1.3.2)的较旧版本,并将其替换为1.6.1。除了.ajax()调用之外,其他所有东西都在工作。添加以上行解决了该问题。



14
这解决了我的问题,在chrome和firefox中有效,但不适用于IE。将此添加到我的脚本的顶部,一切都很好
Peter

@SrBlanco这也解决了我的问题,感谢您分享此信息。
开发人员

4
很好的解决方法,当我使用相对路径从同一域中请求kml文件时,我在Internet Explorer 9上遇到了同样的问题... IE的奥秘...
Matteo Conta,

谢谢。是的,我的其余电话在1.5 jquery更新后停止了。此代码修复了它。
ashraf 2011年

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中没有更多错误。


6
Github项目:github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest和XDomainRequest信息:blogs.msdn.com/b/ieinternals/archive/2010/05/13/…。基本上,IE8和IE9在XMLHttpRequest对象上不支持CORS。您被迫改为使用XDomainRequest对象(这受到更多限制。可以阅读第二个链接上的信息)。
richardaday14年

7

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

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


6

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


2
仅供参考,由于jsonp不支持POST动词,仅支持GET,因此对于原始发帖人的请求确实不起作用。
丹尼尔·考克斯

没错,我用ajax来获取fbwall,google +等的供稿
Abhishek

我仍然要给+1,因为它对我的使用有所帮助,谢谢。
Manatherin

0

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

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

我们添加了2向原点检查,以确认仅授权页面过帐数据与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);
}

0

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

我仅选择使用的模块来构建jquery自己webpack。Ajax始终会失败,并以“无传输”消息作为唯一线索。

经过长时间的调试,事实证明该问题XMLHttpRequest是可插入的,jquery默认情况下不包括在内。

您必须明确包含jquery/src/ajax/xhr文件才能使ajax在浏览器中运行。


-1

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

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

After: /_vti_bin/service.svc

1
是的,没有在url中指定域的jQuery同域ajax请求。在我的情况下,我不需要发出跨站点请求,并且似乎在ajax请求的url参数中包含域会使请求在某种程度上表现出跨站点的行为。我的环境使用带有某些重定向规则的Microsoft ForeFront,这很可能是造成问题的原因。
Draghon 2014年

那么您为什么要回答有关跨域Ajax请求的问题
Naeem Shaikh 2014年

1
@ NaeemShaikh27,请求的性质(跨域还是同域)在OP中尚不清楚;考虑到问题中的“显而易见”参数,我正在解决该问题。无论如何,我只是说“嘿,我遇到了同样的错误,这是我所做的”,无论您是否喜欢(或它是否适合SO),它确实对我有用。现在,如果您回过头来让问题更具体,那么我的回答将完全无关紧要。
Draghon 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.