Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net GET Web API方法返回不允许的方法_.net_Asp.net Web Api_Api Design - Fatal编程技术网

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

.net GET Web API方法返回不允许的方法,.net,asp.net-web-api,api-design,.net,Asp.net Web Api,Api Design,我正在开发web api项目,它将是我们的网站和第三方服务之间的中介,我的网站需要调用我的api,我的api将以第三方服务期望的方式适应请求,但是我的get方法不允许使用get方法,我有点卡住了。我已经尝试启用CORS,但仍然没有帮助,我检查了我们的网站是否真的使用GET verb进行调用,确实如此,但我的Web API仍然返回: 远程服务器返回错误:(405)方法不允许 这是我们网站调用的方法的代码: public IHttpActionResult CommitReserve() {

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

远程服务器返回错误:(405)方法不允许

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

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);
   }
}
我知道我这样做是不好的,但这只是为了测试。如果这真的是个问题,事实证明不是

这是我与邮递员一起发送的请求,但失败:

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 }
    );
}

你回来了吗?如果是这样,则需要显式允许GET:

return Json(data, JsonRequestBehavior.AllowGet);

据我所见,您需要定义“api/Reserve”前缀。您可以使用此字符串向控制器类添加路由属性,或者将方法中的路由属性修改为“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;

希望有帮助。

我解决了这个问题,这个bug对我来说相当有趣

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

我将
IReserveController
作为一个抽象类来解决这个问题


然而,我查看了方法的IL代码
CommitReserve
一次类似抽象类的抽象方法和一次类似接口方法,我没有发现让我感到困扰的显著差异,因为现在我想知道是什么导致了这一问题

如果你的答案必须从一个问题开始,最好是作为一个评论。我编辑了我的问题,如果它返回JSON,你会问哪个方法?我感到困惑,api方法根本没有执行,因为它是被禁止的(不允许的),或者我弄错了?我问你是否从你的操作中返回JSON,答案不清楚。现在我知道你不是,所以请忽略我的回答。添加了我正在提出的要求,以获得更多澄清。这已添加到控制器,无论如何,如果不是,那么如果我没有弄错,它将返回404?确保
api/reserve
指向控制器。你能发布你的
WebApiConfig.cs
文件吗?我编辑了我的问题,但我认为路由不是问题。
CommitReserve
是你唯一的方法吗?确保任何其他方法都不会与此方法的路线冲突。我找到了答案,伙计们,我会回答的,请继续关注。我想知道为什么我被否决了,我真的很喜欢反馈,因为我感觉我正在前进。但是你提到了“我已经检查了我们的网站是否真的使用GET-verb进行了调用,但我的Web API仍在返回:405”是的,我的网站解决方案正在发出GET请求,但我的API阻止了这些请求,因为
CommitReserve
默认情况下仅为POST,请查看我的答案,您将了解我的意思
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;