Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Get调用Web API 2可以,但使用Post调用失败_C#_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

C# 使用Get调用Web API 2可以,但使用Post调用失败

C# 使用Get调用Web API 2可以,但使用Post调用失败,c#,asp.net-web-api,asp.net-web-api2,C#,Asp.net Web Api,Asp.net Web Api2,我可以通过get从静态html表单调用WebAPI2,如下所示 Web API: public class WebServiceController : ApiController { [HttpGet] [Route("api/WebService")] public IHttpActionResult Post(string FirstName, string Surname) { //work return StatusCo

我可以通过
get
静态html表单
调用
WebAPI2
,如下所示

Web API:

public class WebServiceController : ApiController
{
    [HttpGet]
    [Route("api/WebService")]
    public IHttpActionResult Post(string FirstName, string Surname)
    { 
        //work
        return StatusCode(HttpStatusCode.OK);
    }
}
HTML格式:

<form action="http://localhost:27020/api/WebService/" method="get">
    <input type="text" name="FirstName" id="FirstName" />
    <input type="text" name="Surname" id="Surname" />
    <input type="submit" />
</form>

当我使用
method=“post”
[HttpPost]
get
切换到
post
请求时,我在Chrome上看到了下面的屏幕截图:


我做错了什么?

WebAPI无法独立读取每个方法参数。您必须封装它们:

public class WebServiceController : ApiController
{
    [HttpGet]
    [Route("api/WebService")]
    public IHttpActionResult Post(MyRequest request)
    { 
        //work
        return StatusCode(HttpStatusCode.OK);
    }
}

public class MyRequest
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

更改web api路由始终是一个很好的实践,它是

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

之后,您将不需要遵循get put和post,您可以使用全名,就像MVC路由一样。例如

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);