#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в консоли -> если запрос выполнен успешно, но не хватает необходимых параметров, настройте сервер. Если запрос не выполняется, исправьте запрос