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

时间:2017-03-31 10:49:59

标签: .net asp.net-web-api api-design

我正在开发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 }
    );
}

4 个答案:

答案 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代码,就像抽象类的抽象方法一样,并且曾经像界面方法一样,我看到没有什么重大区别让我烦恼,因为现在我想知道什么是负责这个。