GET Web API 方法 returns 方法不允许
GET Web API Method returns method not allowed
我正在开发网络 api 项目,它将成为我们网站和第三方服务之间的中介,我的网站需要调用我的 api,我的 api 将在其中调整请求第三方服务期望它的方式,但是我的获取方法不允许使用方法,我有点卡住了。我已经尝试启用 CORS,但它仍然无济于事,我检查了我们的网站是否真的使用 GET 动词调用并且确实如此,但我的 Web API 仍在返回:
The remote server returned an error: (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 }
);
}
你要回来吗JSON?如果是这样,您需要明确允许 GET:
return Json(data, JsonRequestBehavior.AllowGet);
据我所知,您需要定义 "api/Reserve" 前缀。您可以通过使用此字符串向控制器 class 添加 Route 属性来实现,或者将方法中的 Route 属性修改为 "api/reserve/CommitReserve".
我认为您在 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;
希望对您有所帮助。
我修复了这个问题,这个错误对我来说很有趣。
问题是这个方法 CommitReserve
来自一个接口,显然(抱歉,没有提到它,但我认为它不相关,愚蠢的我!)属性不是继承的(路由是工作的由于方法的名称),一旦应用于接口方法,在实现中 class.
我通过将 IReserveController
设为摘要 class 来解决此问题。
但是我查看了方法 CommitReserve
的 IL 代码,曾经像抽象的抽象方法 class 和曾经像接口方法一样,我没有发现任何让我烦恼的显着差异,因为现在我想要知道是什么原因造成的。
我正在开发网络 api 项目,它将成为我们网站和第三方服务之间的中介,我的网站需要调用我的 api,我的 api 将在其中调整请求第三方服务期望它的方式,但是我的获取方法不允许使用方法,我有点卡住了。我已经尝试启用 CORS,但它仍然无济于事,我检查了我们的网站是否真的使用 GET 动词调用并且确实如此,但我的 Web API 仍在返回:
The remote server returned an error: (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 }
);
}
你要回来吗JSON?如果是这样,您需要明确允许 GET:
return Json(data, JsonRequestBehavior.AllowGet);
据我所知,您需要定义 "api/Reserve" 前缀。您可以通过使用此字符串向控制器 class 添加 Route 属性来实现,或者将方法中的 Route 属性修改为 "api/reserve/CommitReserve".
我认为您在 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;
希望对您有所帮助。
我修复了这个问题,这个错误对我来说很有趣。
问题是这个方法 CommitReserve
来自一个接口,显然(抱歉,没有提到它,但我认为它不相关,愚蠢的我!)属性不是继承的(路由是工作的由于方法的名称),一旦应用于接口方法,在实现中 class.
我通过将 IReserveController
设为摘要 class 来解决此问题。
但是我查看了方法 CommitReserve
的 IL 代码,曾经像抽象的抽象方法 class 和曾经像接口方法一样,我没有发现任何让我烦恼的显着差异,因为现在我想要知道是什么原因造成的。