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 方法返回不允许的方法的主要内容,如果未能解决你的问题,请参考以下文章
在 DELETE 上不允许使用 Owin 自托管 Web API 405 方法