Подтвердить что ты не робот

Как добавить пользовательские методы в 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?

Спасибо!

4b9b3361

Ответ 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 имеет его изначально.

Надеюсь, что это поможет.

Ответ 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, вы можете удалить атрибут или просто украсить свой пакет