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
}
你为什么不指定路线。您的实际问题是使用 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" };
}
}
我正在创建一个名为 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
}
你为什么不指定路线。您的实际问题是使用 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" };
}
}