2017-02-08 22 views
1

Предполагается, что это правильно:Несколько GET no good w/Attribute Routing?

/api/MyDataController.cs

public class MyDataController: ApiController 
{ 
    [HttpGet] 
    [Route("GetOne")] 
    public IHttpActionResult GetOne() { } // works w/o GetTwo 

    [HttpGet] 
    [Route("GetTwo")] 
    public IHttpActionResult GetTwo() { } 
} 

.js

$http({method: 'GET', url: '/api/MyData/GetOne'})... //works w/o GetTwo 
$http({method: 'GET', url: '/api/MyData/GetTwo'})... 

То же this post, версия API является

<package id="Microsoft.AspNet.WebApi" version="5.2.3" 
targetFramework="net461" /> 

Оба вызова Один и Два жаловались на GetOne,

"были найдены несколько действий, которые соответствуют запросу: GetOne по типу MyWeb.API.MyDataControllerGetOne по типу MyWeb.API.MyDataController"

Он работает, если ретранслировать GetTwo() из контроллера Api.

ответ

1

Похоже, что приложение по-прежнему использует маршрутизацию на основе конвенций.

Причина столкновения состоит в том, что шаблон шаблона api/{controller}/{id}, основанный на стандарте, обычно не содержит параметр действия, подобный этому api/{controller}/{action}/{id}. Если вы хотите, чтобы действия, связанные с публикацией, выполнялись с помощью маршрутизации конвенций при использовании ранее предоставленного шаблона.

Если вы хотите использовать маршрутизацию атрибутов вместо этого, вам необходимо включить маршрутизацию атрибутов в файле WebApiConfig.cs, чтобы разрешить работу Atrribute Rout.

public static class WebApiConfig { 
    public static void Register(HttpConfiguration config) { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Вы также должны обновить свои маршруты, чтобы получить то, что вы хотите

[RoutePrefix("MyData")] 
public class MyDataController: ApiController { 

    //GET MyData/GetOne 
    [HttpGet] 
    [Route("GetOne")] 
    public IHttpActionResult GetOne() { } 

    //GET MyData/GetTwo 
    [HttpGet] 
    [Route("GetTwo")] 
    public IHttpActionResult GetTwo() { } 
} 

Readup на атрибуте маршрутизации здесь Attribute Routing in ASP.NET Web API 2

+0

Хорошая точка. Проект - обновленное приложение .aspx WebForm, имеет только Global.asax, не WebApiConfig.cs или другие файлы app_Start. При попытке добавить ** MapHttpAttributeRoutes **, он недоступен в intellisense. Он должен быть частью System.Web.Http, у меня есть RunTime Version = v4.0.30319, Version = 5.2.3.0 – Jeb50

0

Это дополнительный ответ для разработчиков устаревших приложений, как я:

  • перенесено огромное приложение .aspx WebForm из VS 08 (.NET 2.x) t o VS 15 (.NET 4.6)
  • Ожидается, добавив новые технологии, такие как API.

После копания, this - лучший из найденных. Если вы просто используете Global.asax без .cs, просто добавьте его в .asax.