在我的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正在使用此网址)
这里有什么问题?
答案 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;
}
我在这里找到了答案:
答案 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方法响应的网址是:
答案 5 :(得分:0)
最后对我有帮助的是添加了Route
属性,并在那里重复了与全局注册相同的路由。