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

时间:2017-06-06 13:27:25

标签: c# asp.net-web-api asp.net-web-api-routing

我正在创建一个名为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" };
    }
}

是否有任何其他解决方案将操作名称保留为“创建”为下一步。

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" };
    }
}

感谢。

修改

很抱歉第一次不清楚。

根据这个答案:

How does a method in MVC WebApi map to an http verb?

根据动作名称有一个默认的http方法,如果它以Get得到它将被映射到GET HTTP方法是默认的,否则它将被映射到POST。

有没有办法使用自定义映射更改此默认映射,因此我可以使用“GET”Http方法映射名为“Create”的操作以进行测试,因为这种方式可以更快地进行开发

我尝试将HttpGet属性和AcceptVerbs(“GET”)放在一起,它仍然使用POST Http方法映射动作。

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

再次感谢。

2 个答案:

答案 0 :(得分:4)

您可以在此操作之前使用自定义路线:

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

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

config.MapHttpAttributeRoutes();

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

另外,我建议使用IHttpActionResult作为方法的返回类型:

 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

答案 1 :(得分:1)

为什么不指定路线。您实际的问题是使用Uri androidPayUri = Uri.parse("https://www.android.com/payapp/savetoandroidpay/" + jwt); Intent intent = new Intent(Intent.ACTION_VIEW, androidPayUri); 使用&#39; System.Web.Http&#39;代替

System.Web.Mvc