C# Web api不支持POST方法

C# Web api不支持POST方法,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,在我的WebAPI控制器中,我有一个带有以下代码的函数 [HttpPost] public HttpResponseMessage Post(string schooltypeName) { _schoolTypeService.RegisterSchoolType(schooltypeName); var message = Request.CreateResponse(HttpStatusCode

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

       [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"}
请求的url是

http://myhost:8823/SchoolType
(我已配置url,GET正在使用此url)


这里出了什么问题?

将您的操作更改为类似于
Post([FromBody]string schooltypeName)
,因为默认情况下,字符串类型应该是Uri

已更新

将正文更改为just
“Aided”
,因为当前需要一个类才能使反序列化工作正常(例如:
类School{public string SchoolTypeName{get;set;}

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

使用以下命令:

using System.Web.Http;

我发现了这个问题,但在别处找到了答案

我用如下所示的属性装饰了这个方法

    [System.Web.Http.HttpPost]
    public MyOutputObject DoSomething([FromBody]MyInputObject args)
    {
        Console.Writeline(args.ToString());
        return new MyOutputObject();
    }
我的客户端代码(C#,控制台应用程序)的完整性。请注意,这不是一个异步/等待的好例子,因为它有。导致它

私有静态任务MyClientCall(字符串基地址,MyInputObject参数)
{
HttpClient=新的HttpClient();
client.BaseAddress=新Uri(BaseAddress);
client.DefaultRequestHeaders.Accept.Add(
新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
/*您的类名很可能是“MyEntityController”*/
字符串serviceUrl=baseAddress+@“api/MyEntity/DoSomething”;
HttpResponseMessage response=client.postsjsonasync(serviceUrl,args).Result;
控制台写入线(响应);
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
如果(!response.issucessStatusCode)
{
Console.WriteLine(“错误::(“+response.ReasonPhrase”);
返回null;
}
任务包装=response.Content.ReadAsAsync();
返回包装;
}
我在这里找到了答案:


问题归结为:

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

如果启动中的路由已注册到
routes.maphttroute(
您必须使用
[System.Web.Http.HttpPost]

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


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

请检查您正在使用的GET Action方法名称。 您可能使用相同的路由名称来获取方法和发布方法,并期望得到结果

例如:

控制器名称:StudentController

    [Route("api/Student/names")]
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "student1", "student2" };
    }
对于将方法发布到url:

然后您将得到上述错误

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

    [HttpPost]
    [Route("api/Student/getName")]
    public String Post(String name)
    {
        return "success";
    }
那么用于获取post方法响应的url是:


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

更改了,但我总是得到空值作为参数您的注释,“默认情况下,字符串类型应为Uri”,对我来说是个新闻。我已经使用Web API很多年了,但我想我一直都在使用params中的类。我整个上午都在发疯……希望它能更公开一些。长话短说,那么,你用了
[HttpPost]
而不是
[System.Web.Http.HttpPost]
。与其他没有解决真正问题的回答一样,他需要在
Post
通话中使用
[FromBody]
。这值得注意,但最终这不是唯一的问题。除了他还需要
[FromBody]
在Post调用中。这实际上根本没有必要,因为您还必须修饰调用。在这种修饰中,您必须指定名称空间,否则它将自动默认为
[System.Web.Mvc.HttpPost]
,而不是继承自
WebApiController
的类的正确版本,即
[System.Web.Http.HttpPost]
,如果您没有
using
语句;如果您确实有
using
,它将强制您将整个内容放在一起,因为它会冲突。
     [HttpPost]
     [Route("api/Student/names")]
     public String Post(String name)
     {
         return "success";
     }
    [HttpPost]
    [Route("api/Student/getName")]
    public String Post(String name)
    {
        return "success";
    }