C# ASP.Net WEB API 2.0中基于属性的路由/版本控制

C# ASP.Net WEB API 2.0中基于属性的路由/版本控制,c#,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我正在尝试在Asp.NETWebAPI中使用版本控制。 以下是该项目的结构。 为了支持版本控制,我添加了Microsoft.AspNet.WebApi.versioningNuGet软件包。 以下是WebApiConfig的代码片段: public static void Register(HttpConfiguration config) { var constraintResolver = new DefaultInlineConstraintResolve

我正在尝试在Asp.NETWebAPI中使用版本控制。 以下是该项目的结构。

为了支持版本控制,我添加了Microsoft.AspNet.WebApi.versioningNuGet软件包。 以下是WebApiConfig的代码片段:

    public static void Register(HttpConfiguration config)
    {
        var constraintResolver = new DefaultInlineConstraintResolver()
        {
            ConstraintMap =
            {
                ["apiVersion"] = typeof(ApiVersionRouteConstraint)
            }
        };
        config.MapHttpAttributeRoutes(constraintResolver);
        config.AddApiVersioning();
        // Web API configuration and services

        // Web API routes
        //config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
下面是控制器的代码:

[ApiVersion("1.0")]
[RoutePrefix("api/v{version:apiVersion}/employeemanagement")]
public class EmployeeManagementController : ApiController
{
    [Route("GetTest")]
    [HttpGet]
    public string GetTest()
    {
        return "Hello World";
    }

    [Route("GetTest2")]
    [HttpGet]
    public string GetTest2()
    {
        return "Another Hello World";
    }

    [Route("saveemployeedata")]
    [HttpPost]
    public async Task<GenericResponse<int>> SaveEmployeeData(EmployeeData employeeData, ApiVersion apiVersion)
    {
        //code goes here
    }

    [Route("updateemployeedata")]
    [HttpPost]
    public async Task<GenericResponse<int>> UpdateEmployeeData([FromBody]int id, ApiVersion apiVersion)
    {
        //code goes here            
    }
}
以下是URL和数据,我正在传递以生成上述错误:

如果我删除[FromBody],它会给出404未找到错误

请帮助我理解我在这里做错了什么,这是导致上述错误的原因。

您可以使用包含名为
Id
的属性的对象作为操作
UpdateEmployeeData
的参数,而不是直接使用
int Id
,例如:

public class Request
{
    public int Id { get; set; }
}
行动将是:

[Route("updateemployeedata")]
[HttpPost]
public async Task<GenericResponse<int>> UpdateEmployeeData([FromBody]Request request, ApiVersion apiVersion)
{
    //code goes here            
}
[路由(“updateemployeedata”)]
[HttpPost]
公共异步任务UpdateEmployeeData([FromBody]请求请求,ApiVersion ApiVersion)
{
//代码在这里
}

希望这对您有所帮助。

是的。你说得对。我们可以按照你提到的方式达到预期的效果。但是我所采用的方法有什么问题。@VivekSharma代码中的问题是,您发送的对象的属性名为
id
,而不是整数。看看它是如何用括号括起来的,并且该值是如何设置为属性的。一个整数将直接是正文上的值,除此之外,请尝试在JSON中序列化一个整数,得到的结果将是纯文本中的数字。@VivekSharma您可以使用它从JSON生成c#代码,如果您有一个复杂的JSON,这将对您有所帮助。
[Route("updateemployeedata")]
[HttpPost]
public async Task<GenericResponse<int>> UpdateEmployeeData([FromBody]Request request, ApiVersion apiVersion)
{
    //code goes here            
}