Rest API - 不允许使用 405 方法 [重复]

Posted

技术标签:

【中文标题】Rest API - 不允许使用 405 方法 [重复]【英文标题】:Rest API - 405 method not allowed [duplicate] 【发布时间】:2017-05-27 13:36:32 【问题描述】:

我是 Rest API 的新手。我正在尝试从我的应用程序中调用跨域休息 API。 这是我的代码-

 $.ajax(
            type: "GET",
            async: false,
            url: 'http://xx.xxx.xxx.xx:9003/GetProjectList',
            contentType: "application/json",
            dataType: "json",
            traditional: true,
            CrossDomain: true,
            data: 
                StartDate: '2016-12-20',
                EndDate: '2017-01-10'
            ,
            success: function (data) 
                alert("Success");
                alert(data);

            ,

            error: function (xhr, textStatus, errorThrown) 
                alert("Failed");
                alert(xhr);
                alert(textStatus);
                alert(errorThrown);

            
        ); 

但我得到的错误是

OPTIONS http://xx.xxx.xxx.xx:9003/GetProjectList?StartDate=2016-12-20&EndDate=2017-01-10 405 (Method Not Allowed)

XMLHttpRequest cannot load http://xx.xxx.xxx.xx:9003/GetProjectList?StartDate=2016-12-20&EndDate=2017-01-10. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:64207' is therefore not allowed access. The response had HTTP status code 405.

我在这里有什么遗漏吗?任何代码或配置?

如果我直接从浏览器或 Postman 中点击该 URL,它的工作正常。但它在应用程序中不起作用。

【问题讨论】:

这是基本的 CORS 错误。您应该在响应标头中设置所需的 CORS 标头。有很多可用的答案。顺便问一下,您的服务是 web-api 还是 wcf-rest?你不应该同时添加两个标签 您只需要允许 CORS。知道这一点,它并不总是有效! 为什么要在 GET 请求中设置 Content-Type? 【参考方案1】:

问题在于 CORS(跨域请求)。您必须启用 CORS 才能解决问题。

使用 Nuget 包下载

Install-Package Microsoft.AspNet.WebApi.Cors

你应该在 WebApiConfig.cs 中添加一些代码

var corsAttr = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(corsAttr);

更多信息你应该看看: https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

【讨论】:

【参考方案2】:

我认为问题是 CORS 问题(有时 405 也意味着您使用错误的 HTTP 动词调用 API).. 但是读取您的异常看起来像是 CORS 问题.. 试试这个:

using Goocity.API;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Owin;

[assembly: OwinStartup("API", typeof(Goocity.API.Startup))]

    namespace Goocity.API
    
        public partial class Startup
        
            public void Configuration(IAppBuilder app)
            
                #region TO UNCOMMENT WHEN IS IN PRODUCTION
                //var corsPolicy = new CorsPolicy
                //
                //    AllowAnyMethod = true,
                //    AllowAnyHeader = true,
                //    SupportsCredentials = true,
                //    Origins =  "http://www.yoursite.it" 
                //;

                //app.UseCors(new CorsOptions
                //
                //    PolicyProvider = new CorsPolicyProvider
                //    
                //        PolicyResolver = context => Task.FromResult(corsPolicy)
                //    
                //);
                #endregion TO UNCOMMENT WHEN IS IN PRODUCTION

                app.UseCors(CorsOptions.AllowAll);
                ConfigureAuth(app);

            
        
    

尝试将其放入您的启动文件并安装 Microsoft.Owin.Cors nuget 包

【讨论】:

以上是关于Rest API - 不允许使用 405 方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ArcGIS Server REST API - POST OPTIONS 预检请求:405 方法不允许

使用 jquery 查询 wcf rest 服务(不允许 405 方法)

WCF REST 服务返回 405:jQuery AJAX GET 不允许的方法

AngularJS、REST、C# 服务、405 - 不允许发布方法

REST - HTTP 状态 405;方法不允许;请求方法“PUT”不支持错误

Apache Camel REST DSL 405方法不允许