跨域请求被阻止:同源策略禁止在... / Signature.asmx / SendIdDocuments中读取远程资源

时间:2020-10-14 14:04:02

标签: jquery ajax vb.net web-services asmx

我已经使用vb.net创建了一个Web服务。作为包含以下内容的asmx类:

'To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following 
line.
<System.Web.Script.Services.ScriptService()>
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")>
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
<ToolboxItem(False)>
Public Class Signature
Inherits System.Web.Services.WebService

<WebMethod()>
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)>
 Public Function SendIdDocuments(ByVal idPaziente As Object)
 MsgBox("sucessssssss")
 MsgBox(idPaziente)
 Return "test"
 End Function
 End Class

我从ajax调用此ws:

  function callService() {    
  $("[id*=documentiGrid] input[type=checkbox]:checked").each(function () {
  var row = $(this).closest("tr")[0];
  selected.push(row.cells[6].innerHTML);
  });

  selectedJson = JSON.stringify(selected);
     $.ajax({
                url: '.../Signature.asmx/SendIdDocuments',
                data: selectedJson,
                dataType: "jsonp",
                type: "POST",
                crossDomain: true,
                contentType: "application/json;charset=UTF-8",      
                success: function (data) {
                    console.log("succes");
                },              
                error: function (response) {
                    console.log("error");
                },
                failure: function (response) {
                    console.log("failure");
                }
            });
    }

我在单击按钮时调用callService()函数。当我从邮递员尝试此操作时,它可以完美运行,但是当我从项目中尝试此操作时,它将引发此错误:

跨域请求被阻止:“同源起源”策略不允许读取位于http://.../Signature.asmx/SendIdDocuments的远程资源。 (原因:CORS标头“ Access-Control-Allow-Origin”缺失)。

跨域请求被阻止:“同源起源”策略不允许读取位于http://.../Signature.asmx/SendIdDocuments的远程资源。 (原因:CORS请求未成功)

我看到跨源阻止的一些选择被阻止,这表明将数据类型从json更改为jsonp可以解决问题,但是jsonp仅用于GET方法,在我的情况下不起作用,因为我需要使用POST。 有什么帮助吗? :)

1 个答案:

答案 0 :(得分:0)

创建网站时,它托管在http:// localhost:9000之类的地方,或者如果它是真实的在线网站,则在http://www.somesite.com之类的地方

该网站的页面可能包含javascript。该javascript可以发出GET和POST请求,并且可以合理地在网络上发送这些请求的任何地方

浏览器知道javascript是从http:// localhost:9000提供的(或实际网站。无论何时何地。它都有一个来源),因此,如果它捕获了试图访问{ {3}}的网址为“嘿。http://awesomeapi.com/some/senddocuments没有提供此javascript,因此该javascript显然是在尝试访问第三方Web服务。在我按要求进行操作之前,我将先检查一下使用第三方服务就可以了”

因此,在浏览器根据您对GET http://awesomeapi.com ...的代码请求进行操作之前,它会发送自己的请求:OPTIONS http://awesomeapi.com/some/senddocuments并查看响应。那是awesomapi.com的机会,要么批准行动,要么告诉您被塞满。要授予权限,它必须以标有“是的,允许http:// localhost:9000允许我访问GET”的标题作为响应,这时浏览器将知道其已批准,并且可以GET http://awesomeapi.com/some/senddocuments代码正在请求

或者awesomeapi的服务器可以告诉您的代码被塞满;它通过不发送预期的响应来实现。它要么发送错误响应,要么发送不提及localhost:9000的响应,或者允许的方法之一。

此时,卡牌对着您堆叠;如果OPTIONS请求由于任何原因失败或其中没有正确的信息,则您的代码请求将失败,并显示一个错误

要使此解决方案有效,您的网络服务器必须使用有效的CORS响应进行响应。.我什至不知道它是什么样的,因为您的问题包含3个点-您确实有编码为...,而ajax确实在其上做了一个选择,或者您在问题中将真正的主机替换为...。

无论哪种方式,位于...的网络服务器都必须以cors allow origin标头来响应,该标头指定了您的应用运行所在的网址。如果您不拥有服务器...,那肯定有点麻烦,除非您可以摆脱无核心请求的简化功能。在这种情况下,您的选择通常取决于编写托管的代理服务,您的应用与您的代理联系,您的代理在...处获取资源而无需更改