Web api不支持POST方法

时间:2014-02-01 06:10:37

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

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

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

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

            return message;
        }

当我与fiddler打电话时,我收到此错误

{"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

(我配置了网址,GET正在使用此网址)

这里有什么问题?

6 个答案:

答案 0 :(得分:50)

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

<强>更新
将您的正文更改为"Aided",因为目前您需要一个类来进行反序列化( ex class School { public string SchoolTypeName { get; set; } }

答案 1 :(得分:14)

请参阅控制器顶部的使用命名空间,如果您使用的是 System.Web.Mvc ,则可能会出现此问题:

使用此:

using System.Web.Http;

答案 2 :(得分:9)

问题归结为:

如果启动时的路线已在routes.MapRoute(注册 您必须使用[System.Web.Mvc.HttpPost]

修饰帖子方法

如果启动时的路线已在Routes.MapHttpRoute(注册 您必须使用[System.Web.Http.HttpPost]

修饰帖子方法

如果您将MapRoute()[System.Web.Http.HttpPost]一起使用,则无法使用

如果您将MapHttpRoute()[System.Web.Mvc.HttpPost]一起使用,则无法使用

答案 3 :(得分:6)

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

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

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

我的客户端代码(C#,控制台应用)完整性。

    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

答案 4 :(得分:1)

请检查您正在使用的GET Action方法名称。 您可能会在GET方法和POST方法中使用相同的Route名称,并期望得到结果。

示例:

控制器名称: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方法发送网址:http://localhost:59342/api/student/names

然后您将收到上述错误

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

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

然后用于获取post方法响应的网址是:

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

答案 5 :(得分:0)

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