当我调用包含带NO参数的post方法的webAPI控制器时,它会转到该方法。但是,当我传递参数时(以及当我用参数更新api控制器时),请参阅第一个片段下方的片段,我得到405错误,它不支持POST。
var captchURL = "/api/Captcha";
$.ajax({
url: captchURL,
dataType: 'json',
contentType: 'application/json',
type: 'POST'
})
var jsondata = {solution: "7", answer: "7"};
var captchURL = "/api/Captcha";
$.ajax({
url: captchURL,
dataType: 'json',
contentType: 'application/json',
type: 'POST',
data: JSON.stringify(jsondata)
})
更新 - 控制器代码:
public class CaptchaController : ApiController
{
private readonly ICaptchaService _service;
public CaptchaController(ICaptchaService service)
{
_service = service;
}
public Captcha Get()
{
return _service.Get();
}
[HttpPost]
public bool Post(string solution, string answer)
{
return _service.Post();
}
}
更新 - WebApiConfig:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
是不是因为我没有解决方案并且回答params(在我的WebApiConfig中)它没有识别它们?
我做错了什么?
答案 0 :(得分:7)
这是一种稍微不同的设置路线的方法,但我更喜欢它。 在您的控制器代码中,为每个代表GET请求POST的方法添加路由前缀和路由......
[RoutPrefix("Captcha")]
public class CaptchaController : ApiController
{
[Route("Post/{solution}/{answer}")]
[HttpPost]
public bool Post(string solution, string answer)
{
return _service.Post();
}
}
只要您正确设置路径,使用正确键入的参数并返回正确键入的值,这应该可以正常工作。如果使用模型,则不必将参数添加到路径路径中。
当我设置我的WebAPI时,这对我有用。如果有人发现任何错误的解释,请告诉我。我还在学习(而且永远都是),但只是想让你知道我做了什么有用。
答案 1 :(得分:4)
创建模型
public class Captcha {
public string solution { get; set; }
public string answer { get; set; }
}
控制器就是这个
[HttpPost]
public string Post([FromBody] Captcha cap)
{
return cap.solution + " - " + cap.answer;
}
答案 2 :(得分:3)
添加另一个 MapHttpRoute ,它将接受' 解决方案'和' 回答'作为参数
示例:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{solution}/{answer}",
defaults: new { solution = RouteParameter.Optional, answer= RouteParameter.Optional }
);
答案 3 :(得分:2)
[HttpPost]
public bool Post(Captcha cap)
{
return _service.Post();
}
和
将data: JSON.stringify(jsondata)
更改为data : jsondata
。
答案 4 :(得分:1)
它不起作用的原因是因为没有路由会在[post]地址接受2参数 - api / captcha /。
您有2个选项,可以在控制器中设置属性路由
[Route("Post/{solution}/{answer}")]
[HttpPost]
public bool Post(string solution, string answer)
{
return _service.Post();
}
或创建模型
Public class CaptchaModel
{
Public string Solution {get; set;}
Public string Answer {get; set;}
}
并在你的行动方法
[HttpPost]
public bool Post([FromBody] CaptchaModel model)
{
var solution = model.solution;
var answer = model.answer;
.........
return _service.Post();
}
答案 5 :(得分:1)
根据www.asp.net,
“当HTTP方法配置为在服务器上使用,但已针对给定URI禁用时,服务器将以HTTP 405 Method Not Allowed错误响应。”
进一步参考405
答案 6 :(得分:1)
您必须从请求中删除JSON.stringify(数据),然后在模型前添加[FromBody]。然后它会工作。