2014-12-17 5 views
1

Я работаю над asp.net web api с гипермедиа. Теперь я создаю создателя ссылок, который создает ссылку на ресурс, открытый контроллером. Он должен поддерживать атрибут маршруты, которые я решаемые с отражением, но и сопоставляются маршруты, указанные в Owin.AppBuilder:Получить маршрут по названию

public void Configuration(IAppBuilder appBuilder) 
{ 
    var config = new HttpConfiguration(); 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "{controller}/{id}", 
     defaults: new { controller = "Home", id = RouteParameter.Optional } 
     ); 
    // ... 
} 

Я мог бы использовать UrlHelper класс для этого, но это зависит от текущего запроса, и ссылка, которую я создаю, может быть на другом контроллере и, следовательно, не имеет отношения к текущему запросу. Поэтому мне нужно загрузить данные конфигурации маршрута для маршрута с именем DefaultApi. Это любой способ сделать это?

ответ

1

Если вы можете использовать атрибут маршрута, вы можете назвать свой маршрут через свойство имени, то, что я сделал, я определил свои маршруты в RoutesHelper, и когда я определяю маршрут контроллера, я ссылаюсь на эту константу, и когда я хочу использовать Например, CreatedAtRoute ссылается на одно имя routeName и передает параметры для построения маршрута.

Итак, давайте говорить, что мой контроллер называется PeopleController, то я бы определил мой контроллер, как:

[Route("api/people/{id:int:min(1)?}", Name = RoutesHelper.RouteNames.People)] 
public class PeopleController : ApiController 
{ 
    // controller code here 
} 

где RoutesHelper как это:

public static class RoutesHelper 
{ 
    public struct RouteNames 
    { 
     public const string People = "People"; 
     // etc... 
    } 
} 

Теперь в моем посте метода, например, я используйте CreateAtRoute следующим образом:

[HttpPost] 
[ResponseType(typeof(PersonDto))] 
public async Task<IHttpActionResult> AddAsync([FromBody] personDto dto) 
{ 
    // some code to map my dto to the entity using automapper, and save the new entity goes here 
    //. 
    //. 

    // here, I am mapping the saved entity to dto 
    var added = Mapper.Map<PersonDto>(person); 

    // this is where I reference the route by it's name and construct the route parameters. 
    var response = CreatedAtRoute(RoutesHelper.RouteNames.People, new { id = added.Id }, added); 

    return response; 
} 

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

+0

Спасибо, но я боюсь, что это не совсем решает проблему, поскольку я создаю компонент для создания ссылок, который должен поддерживать как маршруты атрибутов, так и маршруты, настроенные в контейнере owin, тогда как проблема связана с чтением шаблоны маршрутов из контейнера. –