【问题标题】:MVC 4.5 Web API request is not workingMVC 4.5 Web API 请求不起作用
【发布时间】:2014-03-14 19:27:58
【问题描述】:

我在 .Net 中设计了一个 MVC 4.5 Web API。 HTTP 请求必须从 Jquery AJAX 调用发出。 拨打电话(POST)后,我在控制台中收到以下错误。谁能帮我确定我做错了什么?

    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 

【问题讨论】:

    标签: jquery ajax asp.net-mvc post asp.net-web-api


    【解决方案1】:

    您通过进行默认不允许的跨域 AJAX 调用违反了same origin policy restriction。您可能需要在 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 }
            );
        }
    }
    

    这将使您能够从支持 CORS 的浏览器向您的 Web API 发出跨域 AJAX 请求。

    【讨论】:

      【解决方案2】:

      我花了一整天的时间在我的 API 中解决这个问题。

      这是我在 API 中覆盖 OPTION 方法的操作

      您必须在 system.webservers 内的 web.cnofig 中进行设置

      <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 的 Register 函数中使用这一行进行注册

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

      【讨论】:

      • 从早上开始,终于解决了我的问题,在此之前我几乎要拥有 api-2.. 非常感谢
      猜你喜欢
      • 2013-06-23
      • 2019-04-30
      • 2013-12-11
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      相关资源
      最近更新 更多