Запрос перекрестного происхождения заблокирован: политика того же источника запрещает чтение удаленного ресурса по адресу …/Signature.asmx/SendIdDocuments

#jquery #ajax #vb.net #web-services #asmx

#jquery #ajax #vb.net #веб-сервисы #asmx

Вопрос:

Я создал веб-сервис, используя vb.net . Это как класс 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
  

Я вызываю этот ws из ajax:

   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() одним нажатием кнопки. Когда я пытаюсь сделать это из postman, он работает отлично, но когда я пытаюсь сделать это из своего проекта, он выдает эту ошибку:

Запрос перекрестного происхождения заблокирован: политика того же источника запрещает чтение удаленного ресурса по адресу http://…/Signature.asmx/SendIdDocuments . (Причина: отсутствует заголовок CORS ‘Access-Control-Allow-Origin’).

Запрос перекрестного происхождения заблокирован: политика того же источника запрещает чтение удаленного ресурса по адресу http://…/Signature.asmx/SendIdDocuments . (Причина: запрос CORS не удался)

Я видел несколько вариантов блокировки перекрестного происхождения, в которых говорится, что изменение типа данных с json на jsonp решает проблему, но jsonp используется только для метода GET и в моем случае не работает, потому что мне нужно использовать POST. Любая помощь? 🙂

Ответ №1:

Когда вы создаете веб-сайт, он размещается где-то вроде http://localhost:9000 , или, если это настоящий живой сайт, где-нибудь вроде http://www.somesite.com

Страницы этого сайта могут содержать javascript. Этот javascript может выполнять запросы GET и POST, и он может разумно находиться в любом месте Сети, куда он отправляет эти запросы

Браузер знает, что javascript был отправлен с http://localhost:9000 (или реальный сайт.. где бы .. у него был один источник, из которого он был отправлен), поэтому, если он перехватит javascript, пытающийся получить доступ http://awesomeapi.com/some/senddocuments url-адрес гласит: «эй.. http://awesomeapi.com не обслуживал этот javascript, так что этот javascript явно пытается попасть в сторонние веб-сервисы.. Прежде чем я сделаю то, что он просит, я просто проверю у сторонней службы, все ли в порядке «

Итак, прежде чем браузер отреагирует на запрос вашего кода, чтобы получить http://awesomeapi.com …, он отправляет свой собственный запрос: OPTIONS http://awesomeapi.com/some/senddocuments и просматривает ответ. То есть awesomapi.com возможность либо разрешить действие, либо сказать вам, чтобы вы набились. Для предоставления он должен ответить заголовком «да, http://localhost:9000 разрешен доступ ко мне для получения», после чего браузер узнает, что он одобрен, и он переходит и выполняет GET http://awesomeapi.com/some/senddocuments запрос вашего кода

Или сервер awesomeapi может сообщить вашему коду, что он заполнен; он делает это, не отправляя ожидаемый ответ обратно. Либо он отправляет ответ с ошибкой, либо отправляет ответ, в котором не упоминается localhost: 9000, или один из разрешенных методов .. или что угодно

На данный момент карты сложены против вас; если запрос ПАРАМЕТРОВ завершается неудачей по какой-либо причине или в нем нет нужной информации, ваш запрос кода завершается ошибкой, подобной той, которую вы видите там

Чтобы это сработало, ваш веб-сервер должен ответить действительным ответом CORS.. Я даже не уверен, как это выглядит, поскольку ваш вопрос содержит 3 точки — либо вы действительно закодировали ... , и ajax действительно сделал для него опции, либо вы заменили реальный хост на … в вашем вопросе.

В любом случае веб ... -сервер должен отвечать заголовком cors allow origin, который указывает URL-адрес, по которому запускается ваше приложение. Если у вас нет собственного сервера ... , вы в некотором роде облажались, если только вам не сойдет с рук ограниченная функциональность запроса без cors. Ваши варианты в этих случаях обычно сводятся к написанию прокси-службы, которую вы размещаете, ваше приложение связывается с вашим прокси-сервером, ваш прокси-сервер извлекает ресурс по адресу ... без cors

Комментарии:

1. … эти три точки — локальный хост, на котором выполняется мой проект.

2. Никаких проблем.. Просто помните, что если ответ на браузер, выдающий ПАРАМЕТРЫ, Является ошибкой (ошибка 404, ошибка 500 и т. Д.), Вы также получите сбой CORS… Вся информация, необходимая для решения этой проблемы, находится прямо на вкладке сеть вашей консоли browserdev; 1) почему он выдает ПАРАМЕТРЫ, если он того же происхождения, 2) что содержат ПАРАМЕТРЫ, 3) каков ответ на параметры, 4) что такое сообщение об ошибке CORSв консоли -> если запрос выполнен успешно, но не хватает необходимых параметров, настройте сервер. Если запрос не выполняется, исправьте запрос