Подтвердить что ты не робот

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.

Любая помощь в том, почему эта ошибка возникает, будет большой помощью.

4b9b3361

Ответ 1

Ваш код на самом деле пытается сделать Междоменный (CORS) запрос, а не обычный POST.

То есть: Современные браузеры разрешают только вызовы Ajax для служб в одном домене как HTML-страницу.

Пример: Страница в http://www.example.com/myPage.html может запрашивать только услуги, находящиеся в http://www.example.com, например http://www.example.com/testservice/etc. Если служба находится в другом домене, браузер не будет выполнять прямой вызов (как и следовало ожидать). Вместо этого он попытается сделать запрос CORS.

Короче говоря, чтобы выполнить запрос CORS, ваш браузер:

  • Сначала отправит запрос OPTION на целевой URL
  • И затем , только если ответ сервера на этот OPTION содержит соответствующие заголовки (Access-Control-Allow-Origin является одним из них), чтобы разрешить запрос CORS, просмотр будет выполнять вызов (почти так, как если бы HTML-страница была в том же домене).
    • Если ожидаемые заголовки не появятся, браузер просто откажется (как и с вами).

Как его решить? Самый простой способ - включить 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);
    }
    ...
}