我正在开发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 }
);
}
答案 0 :(得分:1)
你回来了JSON吗?如果是这样,您需要明确允许GET:
return Json(data, JsonRequestBehavior.AllowGet);
答案 1 :(得分:0)
从我所看到的,你需要定义&#34; api / Reserve&#34;字首。您可以通过使用此字符串向控制器类添加Route属性来执行此操作,或者将方法中的Route属性修改为&#34; api / reserve / CommitReserve&#34;。
答案 2 :(得分:0)
我认为您在 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;
希望它有所帮助。
答案 3 :(得分:0)
我解决了这个问题,这个bug对我来说很有趣。
问题是这个方法CommitReserve
来自一个接口而且显然(对不起,因为没有提及它,但我认为它不相关,愚蠢我!)属性不是继承的(路由工作是因为方法的名称,一旦应用于接口方法,在实现类中。
我通过使IReserveController
成为一个抽象类来解决这个问题。
然而,我曾经看过方法CommitReserve
的IL代码,就像抽象类的抽象方法一样,并且曾经像界面方法一样,我看到没有什么重大区别让我烦恼,因为现在我想知道什么是负责这个。