2014-02-15 67 views
0

我在.Net中設計了MVC 4.5 Web API。 HTTP請求必須由Jquery AJAX Call完成。 撥打電話(POST)後,在控制檯中出現以下錯誤。任何人都可以幫助我確定我做錯了什麼嗎?MVC 4.5 Web API請求不起作用

OPTIONS http://192.168.xx.xx:1245/api/values 405 (Method Not Allowed) jquery-1.7.1.min.js:4 
OPTIONS http://192.168.xx.xx:1245/api/values Invalid HTTP status code 405 jquery-1.7.1.min.js:4 
XMLHttpRequest cannot load http://192.168.xx.xx:1245/api/values. Invalid HTTP status code 405 

回答

2

您違反了same origin policy restriction通過進行默認情況下不允許的跨域AJAX調用。您可能需要在Web API端啓用CORS:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

Install-Package Microsoft.AspNet.WebApi.Cors -project YourWebApiProject 

,然後在你的配置只需啓用CORS:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.EnableCors(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

這將使你做跨域AJAX請求到你的Web API來自支持CORS的瀏覽器。

1

我花了一整天在我的API中修復這個問題。

這裏是我做了覆蓋期權方法的API

你必須設置這個在您的web.cnofig內system.webservers

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*"/> 
    <add name="Access-Control-Allow-Headers" value="Accept, Authorization, Data, Content-Type" /> 
    <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" /> 
    </customHeaders> 
</httpProtocol> 

然後在你的WebApiConfig.cs把這個代碼

public class OptionsHttpMessageHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Method == HttpMethod.Options) 
     { 
      return Task.Factory.StartNew(() => 
      { 
       var resp = new HttpResponseMessage(HttpStatusCode.OK); 

       return resp; 
      }); 
     } 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

並註冊與該行的註冊功能在同WebApiConfig.cs

GlobalConfiguration.Configuration.MessageHandlers.Add(new OptionsHttpMessageHandler()); 
+1

從早上開始,最後這解決了我的問題,我幾乎要在這之前有api-2 ..非常感謝 –