C# 带有参数的webapi post方法不';行不通
当我调用我的webAPI控制器时,该控制器包含一个没有参数的post方法,它将转到该方法。但是,当我将参数(以及当我用参数更新api控制器时)传递到这个代码段中时,请参见第一个代码段下面的代码段,我得到了405个错误,它不支持POSTC# 带有参数的webapi post方法不';行不通,c#,ajax,post,asp.net-web-api,C#,Ajax,Post,Asp.net Web Api,当我调用我的webAPI控制器时,该控制器包含一个没有参数的post方法,它将转到该方法。但是,当我将参数(以及当我用参数更新api控制器时)传递到这个代码段中时,请参见第一个代码段下面的代码段,我得到了405个错误,它不支持POST var captchURL = "/api/Captcha"; $.ajax({ url: captchURL, dataType: 'json', contentType: 'application/json',
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();
}
}
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
更新-WebApiConfig:
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();
}
}
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
是因为我没有解决方案和答案参数(在我的WebApiConfig中),所以它无法识别它们吗
我做错了什么?创建一个模型
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;
}
添加另一个将接受“解决方案”和“答案”作为参数的MapHttpRoute 样本:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{solution}/{answer}",
defaults: new { solution = RouteParameter.Optional, answer= RouteParameter.Optional }
);
及
将
data:JSON.stringify(jsondata)
更改为data:jsondata
这是一种稍微不同的路由设置方法,但我更喜欢它。
在控制器代码中,为每个表示POST of GET请求的方法添加路由前缀和路由
[RoutPrefix("Captcha")]
public class CaptchaController : ApiController
{
[Route("Post/{solution}/{answer}")]
[HttpPost]
public bool Post(string solution, string answer)
{
return _service.Post();
}
}
只要正确设置路径、使用正确类型的参数并返回正确类型的值,这项功能就可以正常工作。如果使用模型,则不必将参数添加到管线路径中
这在我设置WebAPI时对我起了作用。如果有人认为解释有什么问题,请告诉我。我仍在学习(并将一直学习),但我只是想让您知道我做了哪些工作。它不起作用的原因是,在您的[post]地址-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();
}
根据www.asp.net 当一个HTTP方法被配置为在服务器上使用,但它已被给定URI禁用时,服务器将以HTTP 405 method Not Allowed错误响应 关于405的进一步参考
您必须从请求中删除JSON.stringify(数据),然后在模型前面添加[FromBody]。然后它就会工作。从您的controller@jpgrassi-我用控制器代码进行了更新-我还刚刚在帖子中添加了参数method@webdad3为什么要对数据进行字符串化我认为不应该
data:jsondata
isenough@meda-两种方法都尝试了,但都出现了相同的错误。您是否检查了控制台以查看是否存在错误记录了错误吗?当我这样做时,我进入了控制器,但“cap”为空。你确定你的uri是正确的吗?尝试执行以下操作:var captchURL=“api/captcha”;肯定的。我也更改了captchURL,没有任何更改。请尝试删除私有只读ICaptchaService\u服务;公共CaptchaController(ICaptchaService服务){u service=service;}