C# Web api不支持POST方法
在我的WebAPI控制器中,我有一个带有以下代码的函数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
[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";
}