ASP.Net WebApi 使用操作名称更改此默认请求方法映射

ASP.Net WebApi change this default request method mapping with action name

我正在创建一个名为 Customer 的新 Web API 控制器。 这个 Controller 有一个名为 "Create"

的 Action

我无法通过 "GET" HTTP 请求请求此操作 这种形式

http://ip:port/api/Customer/Create?userId=x&password=y

此方法除外:

public class CustomerController : ApiController
{
    [System.Web.Mvc.AcceptVerbs("GET", "POST")]
    [System.Web.Mvc.HttpGet]
    [ActionName("Create")]
    public MISApiResult<List<Branch>> GetCreate(string userID, string password)
    {
        return new MISApiResult<List<Branch>>() { Result = new List<Branch>() { new Branch() { ID = Guid.NewGuid(), Name = "Branch1" } }, ResultCode = 1, ResultMessage = "Sucess" };
    }
}

是否有任何其他解决方案可以将动作名称保留为 "Create" 作为下一个。

public class CustomerController : ApiController
{
    [System.Web.Mvc.AcceptVerbs("GET", "POST")]
    [System.Web.Mvc.HttpGet]
    public MISApiResult<List<Branch>> Create(string userID, string password)
    {
        return new MISApiResult<List<Branch>>() { Result = new List<Branch>() { new Branch() { ID = Guid.NewGuid(), Name = "Branch1" } }, ResultCode = 1, ResultMessage = "Sucess" };
    }
}

谢谢。

编辑:

抱歉第一次没说清楚

根据这个回答:

根据动作名称有一个默认的http方法,如果以Get开头,则默认映射为GET HTTP Method,否则映射为POST。

有没有办法用自定义映射更改此默认映射,以便我可以将名为 "Create" 的操作映射到 "GET" Http 方法以进行测试,因为这种方式开发速度更快

我尝试放置 HttpGet 属性和 AcceptVerbs("GET"),它仍然使用 POST Http 方法映射操作。

我找到了一种方法,就像我说的那样,它是将操作方法​​名称更改为 GetCreate,然后将 ActionName 属性设置为 "Create" 值。 但是有没有办法更改默认映射?

再次感谢。

您可以为此操作使用自定义路由:

[HttpGet]
[Route("customer/create")]
public MISApiResult<List<Branch>> Create(string userID, string password)

不要忘记在应用程序配置期间启用属性路由(这应该在默认路由定义之前添加):

config.MapHttpAttributeRoutes();

虽然我建议遵循约定并使用适当的 HTTP 动词 - 如果您要创建客户,那么按照约定您应该使用 POST 请求到端点 api/customers 。否则你的 API 可能会让其他人感到困惑。

此外,我建议使用 IHttpActionResult 作为方法的 return 类型:

 public IHttpActionResult Post(string userID, string password)
 {
     if (_userRepository.Exists(userID))
         return BadRequest($"User with ID {userID} already exists");

     _userRepository.Create(userID, password);
     return StatusCode(HttpStatusCode.Created) // or CreatedAtRoute
 }

进一步阅读:Attribute Routing in ASP.NET Web API 2

你为什么不指定路线。您的实际问题是使用 System.Web.Mvc 使用 System.Web.Http 代替

 using System.Web.Http;
 [RoutePrefix("api/Customer")]
    public class CustomerController : ApiController
    {
        [HttpGet]
        [Route("Create")]
        public MISApiResult<List<Branch>> Create(string userID, string password)
        {
            return new MISApiResult<List<Branch>>() { Result = new List<Branch>() { new Branch() { ID = Guid.NewGuid(), Name = "Branch1" } }, ResultCode = 1, ResultMessage = "Sucess" };
        }
    }