JQuery.ajax() POST Request выбрасывает 405 (метод не разрешен) в RESTful WCF
Я отправляю почтовый запрос в сервисное приложение RESTFUL WCF. Я могу успешно отправить запрос POST
через Fiddler.
Однако, когда я это делаю с помощью jQuery Ajax, функция возвращает следующее в консоль разработчика Chrome:
OPTIONS http://www.example.com/testservice/service1.svc/GetData 405 (Method Not Allowed) jquery.min.js:6
Но затем вторая после журналов:
Object {d: "You entered 10"} testpost.html:16
Это говорит о том, что jQuery отправляет запрос OPTIONS
, который терпит неудачу, а затем отправляет запрос POST
, который возвращает ожидаемые данные.
Мой код jQuery:
$.ajax() {
type: "POST", //GET or POST or PUT or DELETE verb
url: "http://www.example.com/testservice/service1.svc/GetData", // Location of the service
data: '{"value":"10"}', //Data sent to server
contentType:"application/json",
dataType: "json", //Expected data format from server
processdata: false,
success: function (msg) {//On Successfull service call
console.log(msg);
},
error: function (xhr) { console.log(xhr.responseText); } // When Service call fails
});
Я использую jQuery версии 2.0.2.
Любая помощь в том, почему эта ошибка возникает, будет большой помощью.
Ответы
Ответ 1
Ваш код на самом деле пытается сделать Междоменный (CORS) запрос, а не обычный POST
.
То есть: Современные браузеры разрешают только вызовы Ajax для служб в одном домене как HTML-страницу.
Пример: Страница в http://www.example.com/myPage.html
может запрашивать только услуги, находящиеся в http://www.example.com
, например http://www.example.com/testservice/etc
. Если служба находится в другом домене, браузер не будет выполнять прямой вызов (как и следовало ожидать). Вместо этого он попытается сделать запрос CORS.
Короче говоря, чтобы выполнить запрос CORS, ваш браузер:
Как его решить? Самый простой способ - включить CORS (включить необходимые заголовки) на сервере.
Если у вас нет доступа к серверу, вы можете зеркалировать веб-сервис из другого места, а затем включить CORS.
Ответ 2
Вы должны добавить этот код в global.aspx:
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
Ответ 3
Вы также можете создать необходимые заголовки в фильтре.
@WebFilter(urlPatterns="/rest/*")
public class AllowAccessFilter implements Filter {
@Override
public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain chain) throws IOException, ServletException {
System.out.println("in AllowAccessFilter.doFilter");
HttpServletRequest request = (HttpServletRequest)sRequest;
HttpServletResponse response = (HttpServletResponse)sResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
chain.doFilter(request, response);
}
...
}