Я работаю над 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
. Это любой способ сделать это?
Если вы можете использовать атрибут Route Attribute, вы можете назвать свой маршрут через свойство name, то, что я сделал, я определил свои маршруты в RoutesHelper, и когда я определяю маршрут контроллера, я ссылаюсь на эту константу и когда я хочу использовать CreateAtRoute, например, я ссылайтесь на одно и то же имя маршрута и передавайте параметры для построения маршрута.
Поэтому позвольте сказать, что мой контроллер называется 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 name and construct the route parameters.
var response = CreatedAtRoute(RoutesHelper.RouteNames.People, new { id = added.Id }, added);
return response;
}
Надеюсь это поможет.