GET Web API 方法返回不允许的方法

Posted

技术标签:

【中文标题】GET Web API 方法返回不允许的方法【英文标题】:GET Web API Method returns method not allowed 【发布时间】:2017-08-25 14:48:17 【问题描述】:

我正在开发 web api 项目,它将成为我们的网站和第三方服务之间的中介,我的网站需要调用我的 api,我的 api 将以第三方服务所期望的方式调整请求,但是我正在获取方法我的 get 方法不允许,我有点卡住了。我尝试启用 CORS,但它仍然没有帮助,我检查了我们的网站是否真的使用 GET 动词进行调用并且确实如此,但我的 Web API 仍在返回:

远程服务器返回错误:(405) Method Not Allowed。

这是我们网站调用的方法的代码:

public IHttpActionResult CommitReserve()

    var request = this.Request;
    this.Logger.InfoFormat("CommitReserve: 0", request.RequestUri);

    try
    
        var customerID = request.GetRequestParameter<string>("cust_id");
        var reserveID = request.GetRequestParameter<int>("reserve_id");
        this.Logger.InfoFormat("CommitReserve: ReserveId: 0, CustID: 1", reserveID, customerID);

        HttpResponseMessage response = new HttpResponseMessage();
        StringBuilder sb = new StringBuilder();

        sb.AppendLine("error_code=" + 0);
        sb.AppendLine("error_message=");
        sb.AppendLine("trx_id=" + reserveID);
        sb.Append("balance=" + 0);

        response.Content = new StringContent(sb.ToString());
        response.StatusCode = HttpStatusCode.OK;
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");

        return this.ResponseMessage(response);
   
   catch (Exception ex)
   
        this.Logger.ErrorFormat("CommitReserve: 0" + ex);
        return this.BadRequest(ex.Message);
   

这就是我启用 CORS 的方式:

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

我知道我这样做的方式很糟糕,但这只是为了测试这是否真的是问题,事实证明不是。

这是我通过邮递员发送的请求,但它失败了:

GET http://localhost:60747/api/Reserve/CommitReserve?cust_id=32569_5001&reserve_id=62150259&SportTypeID=sport HTTP/1.1
Host: localhost:60747
Proxy-Connection: keep-alive
Postman-Token: 8f26fb31-d59d-78c8-2399-3b46c4beeff5
Cache-Control: no-cache
cust_id: 32569_5001
reserve_id: 62148599
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml,    like Gecko) Chrome/56.0.2924.87 Safari/537.36
amount: 2
Accept: */*
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8,pt;q=0.6

所以我在这里没有选择..

**编辑 **

WebApiConfig.cs 按要求:

public static void Register(HttpConfiguration config)

    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();
    config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

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

【问题讨论】:

确保api/reserve 连接到控制器。您可以发布您的WebApiConfig.cs 文件吗?和记录器跟踪,如果你有的话。 我编辑了我的问题,但我认为路由不是问题.. CommitReserve 是您唯一的方法吗?确保任何其他方法不与此方法的路由冲突。 我找到答案了,我会回答的,敬请期待。 我想知道为什么我被否决了,我真的很喜欢这些反馈,因为我觉得我在前进。 【参考方案1】:

您要返回 JSON 吗?如果是这样,您需要明确允许 GET:

return Json(data, JsonRequestBehavior.AllowGet);

【讨论】:

如果您的答案必须以问题开头,最好作为评论。 我编辑了我的问题,你问的是哪种方法是否返回 JSON ?我很困惑,api方法根本没有执行,因为它是禁止的(不允许),还是我弄错了? 我在问您是否从您的操作中返回 JSON,答案并不清楚。现在我发现你不是,所以请忽略我的回答。 添加了我提出的要求以进行更多说明【参考方案2】:

据我所知,您需要定义“api/Reserve”前缀。您可以使用此字符串向控制器类添加 Route 属性,或将方法中的 Route 属性修改为“api/reserve/CommitReserve”。

【讨论】:

这已经添加到控制器了,反正如果没有,如果我没记错的话,它会返回 404?【参考方案3】:

我认为您的 GetRequestParameter 中出现此错误。所以你需要像这样访问你的查询字符串,

var _req = Request.GetQueryNameValuePairs();
string customerID = _req.FirstOrDefault(ma => string.Compare(ma.Key, "cust_id") == 0).Value;
string reserveID = _req.FirstOrDefault(ma => string.Compare(ma.Key, "reserve_id") == 0).Value;

希望对你有帮助。

【讨论】:

但是您提到“我检查了我们的网站是否真的使用 GET 动词进行调用并且确实如此,但我的 Web API 仍在返回:405” 是的,我的网站解决方案正在发出 GET 请求,但我的 API 阻止了它们,因为 CommitReserve 默认情况下仅 POST,请查看我的回答,您会明白我的意思【参考方案4】:

我修复了这个问题,这个错误对我来说相当有趣。

问题是这个方法CommitReserve 来自一个接口并且显然(抱歉,没有提到它,但我认为它不相关,我很傻!)属性没有被继承(路由工作是因为名称方法),一旦应用于接口方法,在实现类中。

我通过将IReserveController 设为抽象类来解决此问题。

但是,我查看了方法 CommitReserve 的 IL 代码,曾经像抽象类的抽象方法,曾经像接口方法,但我没有发现让我感到困扰的显着差异,因为现在我想知道是什么原因造成的。

【讨论】:

以上是关于GET Web API 方法返回不允许的方法的主要内容,如果未能解决你的问题,请参考以下文章

405 方法不允许 Web API 2

如何使用 Web API Get 方法返回图像

在 DELETE 上不允许使用 Owin 自托管 Web API 405 方法

ASP.NET Web API - 请求的资源不支持 http 方法“GET”

Web Api - 不允许使用 Catch 405 方法

WebApi Post 方法总是返回“请求的资源不支持 http 方法 'GET'。”状态:405 方法不允许