Как добавить пользовательские методы в ASP.NET контроллер WebAPI?
В проекте ASP.NET MVC WebAPI по умолчанию мы создали следующий контроллер
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
Но можно ли здесь добавить какие-либо пользовательские методы, чтобы они могли поддерживать get/post?
Спасибо!
Ответы
Ответ 1
Вы можете использовать такие атрибуты, как RoutePrefix, с типом Http.
[Route("ChangePassword")]
[HttpPost] // There are HttpGet, HttpPost, HttpPut, HttpDelete.
public async Task<IHttpActionResult> ChangePassword(ChangePasswordModel model)
{
}
Тип http вернет его обратно к его правильному методу в сочетании с именем маршрута.
Ответ 2
Я не уверен, что следую за тем, как у вас есть GET
и POST
прямо в вашем коде, но в любом случае у вас есть другие опции:
Вариант 1
Сначала вы можете настроить свои пользовательские маршруты в папке App_Start
в файле WebApiConfig.cs
. Вот что я обычно использую:
// GET /api/{resource}/{action}
config.Routes.MapHttpRoute(
name: "Web API RPC",
routeTemplate: "{controller}/{action}",
defaults: new { },
constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("GET") }
);
// GET|PUT|DELETE /api/{resource}/{id}/{code}
config.Routes.MapHttpRoute(
name: "Web API Resource",
routeTemplate: "{controller}/{id}/{code}",
defaults: new { code = RouteParameter.Optional },
constraints: new { id = @"\d+" }
);
// GET /api/{resource}
config.Routes.MapHttpRoute(
name: "Web API Get All",
routeTemplate: "{controller}",
defaults: new { action = "Get" },
constraints: new { httpMethod = new HttpMethodConstraint("GET") }
);
// PUT /api/{resource}
config.Routes.MapHttpRoute(
name: "Web API Update",
routeTemplate: "{controller}",
defaults: new { action = "Put" },
constraints: new { httpMethod = new HttpMethodConstraint("PUT") }
);
// POST /api/{resource}
config.Routes.MapHttpRoute(
name: "Web API Post",
routeTemplate: "{controller}",
defaults: new { action = "Post" },
constraints: new { httpMethod = new HttpMethodConstraint("POST") }
);
// POST /api/{resource}/{action}
config.Routes.MapHttpRoute(
name: "Web API RPC Post",
routeTemplate: "{controller}/{action}",
defaults: new { },
constraints: new { action = @"[A-Za-z]+", httpMethod = new HttpMethodConstraint("POST") }
);
Я использую комбинацию конечных точек RESTful
, а также конечных точек RPC
. Для некоторых пуристов это является основанием для священной войны. Для меня я использую комбинацию из двух, потому что это мощная комбинация, и я не могу найти разумную причину.
Вариант 2
Как указывали другие, и поскольку я сам делаю больше из этих дней, используйте маршрутизацию атрибутов:
[HttpGet]
[GET("SomeController/SomeUrlSegment/{someParameter}")]
public int SomeUrlSegment(string someParameter)
{
//do stuff
}
Мне понадобился пакет NuGet для маршрутизации атрибутов, чтобы сделать эту работу (просто выполните поиск NuGet для "Маршрутизация атрибутов" ), но я думаю, что MVC 5/WebAPI 2 имеет его изначально.
Надеюсь, что это поможет.
Ответ 3
Вы можете использовать маршрутизацию атрибутов:
[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }
Некоторые документы для начала работы:
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Ответ 4
Сначала Поместите этот маршрут в webapiconfig.cs
config.Routes.MapHttpRoute(
name: "ApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Теперь вы можете добавлять действия к своим контроллерам, таким как
[HttpPost]
public void Upload()
{
//Do some thing
}
Я украсил действие загрузки с помощью атрибута httppost, которое означает, что это действие принимает только только сообщения-сообщения, если вы хотите, чтобы действия были GET, вы можете удалить атрибут или просто украсить свой пакет