【问题标题】:Web api not supporting POST methodWeb api 不支持 POST 方法
【发布时间】:2014-02-01 06:10:36
【问题描述】:

在我的 web api 控制器中,我有一个带有以下代码的函数

       [HttpPost]
        public HttpResponseMessage Post(string schooltypeName)
        {
            _schoolTypeService.RegisterSchoolType(schooltypeName);

            var message = Request.CreateResponse(HttpStatusCode.Created);

            return message;
        }

当我用提琴手打电话时,我收到了这个错误

{"Message":"The requested resource does not support http method 'POST'."}

我的摆弄参数是

标题

User-Agent: Fiddler

Host: myhost:8823

Content-Type: application/json; charset=utf-8

Content-Length: 26

请求正文

{"schooltypeName":"Aided"}

请求的网址是

http://myhost:8823/SchoolType

(我配置了 url,GET 正在使用这个 url)

这里有什么问题?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-web-api


    【解决方案1】:

    将您的操作更改为 Post([FromBody]string schooltypeName),因为默认字符串类型预计为 Uri。

    更新
    将您的正文更改为 "Aided",因为目前您需要一个类来使反序列化工作,否则 (ex:class School { public string SchoolTypeName { get; set; } }

    【讨论】:

    • 已更改,但我总是将空值作为参数
    • 您的评论“默认字符串类型预计会出现在 Uri”,这对我来说是新闻。多年来我一直在使用 Web API,但我想我一直在 params 中使用类。我整个早上都在为此拉头发……希望它被更多人宣传。
    【解决方案2】:

    查看控制器顶部的using namespace,如果你使用的是System.Web.Mvc,那么可能会出现这个问题:

    使用这个:

    using System.Web.Http;
    

    【讨论】:

    • 这实际上最终是不必要的,因为你还必须装饰调用。在该装饰中,您必须指定命名空间,否则它将自动默认为[System.Web.Mvc.HttpPost],而不是继承自WebApiController 的类的正确版本,即[System.Web.Http.HttpPost],如果您没有using 语句;如果你有using,它会强制让你把整个东西放上去,无论如何,因为它冲突。
    【解决方案3】:

    问题归结为:

    如果您在启动时的路线已注册routes.MapRoute( 你必须用[System.Web.Mvc.HttpPost]装饰你的post方法

    如果您在启动时的路线注册了Routes.MapHttpRoute( 你必须用[System.Web.Http.HttpPost]装饰你的post方法

    如果您将MapRoute()[System.Web.Http.HttpPost] 一起使用,它将不起作用

    如果您将MapHttpRoute()[System.Web.Mvc.HttpPost] 一起使用,它将不起作用

    【讨论】:

    • 除了他在 Post 调用中还需要[FromBody]
    【解决方案4】:

    为未来的读者。我找到了这个问题..但在其他地方找到了(我的)答案。

    我用下面看到的属性修饰了方法。

        [System.Web.Http.HttpPost]
        public MyOutputObject DoSomething([FromBody]MyInputObject args)
        {
            Console.Writeline(args.ToString());
            return new MyOutputObject();
        }
    

    为了完整性,我的客户端代码(C#、控制台应用程序)。请注意,它不是 async/await 的好例子,因为它有 .Result

        private static Task<MyOutputObject> MyClientCall(string baseAddress, MyInputObject args)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(baseAddress);
            client.DefaultRequestHeaders.Accept.Add(
               new MediaTypeWithQualityHeaderValue("application/json"));
    
               /* Your class name would be "MyEntityController" most likely */
            string serviceUrl = baseAddress + @"api/MyEntity/DoSomething";
    
            HttpResponseMessage response = client.PostAsJsonAsync(serviceUrl, args).Result;
    
            Console.WriteLine(response);
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);
    
            if (!response.IsSuccessStatusCode)
            {
                Console.WriteLine("ERROR:  :(   " + response.ReasonPhrase);
                return null;
            }
            Task<MyOutputObject> wrap = response.Content.ReadAsAsync<MyOutputObject>();
            return wrap;
        }
    

    我在这里找到了答案:

    http://blog.dontpaniclabs.com/post/2013/01/23/That-Pesky-Requested-Resource-Does-Not-Support-HTTP-Method-POST-Error-When-Using-MVC-Web-API

    【讨论】:

    • 长话短说,你有[HttpPost]而不是[System.Web.Http.HttpPost]。与没有解决真正问题的其他回复相同,他在Post 电话中需要[FromBody]。值得注意的是,但这最终并不是唯一的问题。
    【解决方案5】:

    请检查您正在使用的 GET 操作方法名称。 您可能对 GET 方法和 POST 方法使用相同的路由名称并期待结果。

    例子:

    控制器名称:StudentController

        [Route("api/Student/names")]
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "student1", "student2" };
        }
    

    方法 (GET) 的网址:http://localhost:59342/api/student/names

         [HttpPost]
         [Route("api/Student/names")]
         public String Post(String name)
         {
             return "success";
         }
    

    对于 POST 方法到 url:http://localhost:59342/api/student/names

    然后你会得到上面提到的错误

    解决方案:更改 POST 操作方法名称,如下所示

        [HttpPost]
        [Route("api/Student/getName")]
        public String Post(String name)
        {
            return "success";
        }
    

    那么用于获取post方法响应的url是:

    http://localhost:59342/api/student/getName

    【讨论】:

      【解决方案6】:

      最后对我有帮助的是添加Route 属性,并在那里重复与全球注册的相同路线。

      【讨论】:

        【解决方案7】:

        如果为控制器类添加属性[RoutePrefix("samplePrefix")],但没有为指定的post方法添加属性[Route("sampleRoute")],可能会出现此问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-07
          • 1970-01-01
          • 2020-12-13
          • 2020-04-13
          相关资源
          最近更新 更多