1

Данная маршрутизация атрибутов в ядре ASP.Net (но я думаю, что MVC и WebAPI работают одинаково), я хочу иметь возможность делать что-то вроде этого:Как получить суффикс из url в качестве параметра действия при выполнении маршрутизации атрибутов в ASP.NET

[Route("api/[controller]")] 
public class SampleController : Controller { 
    // GET api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css 
    [HttpGet("{id}")] // this is wrong, how should it be written correctly? 
    public string Get(Guid id, string urlSuffix) { 
     return null; // return stuff based on the id and the full url 
    } 
} 

в URL взятой в качестве примера в комментарии (api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css) метод SampleController.Get должен быть вызван со следующими параметрами:

  • ID: 123e4567-e89b-12d3-a456-426655440000
  • urlSu ffix: folder/subfolder/file.css или /folder/subfolder/file.css (я на самом деле не заботиться о ведущей /)

Если есть дополнительные параметры запроса, они должны быть включены в суффикс, а также.

Я думал об использовании необработанного URL-адреса запроса, но мне все-таки нужен способ указать действие, которое выполняется, и что когда-либо я думал, было слишком поздно, ASP.Net уже выяснил, что нет URL для данного действия.

Я хотел бы использовать контроллеры для этого вместо добавления некоторого «необработанного» кода в конвейер выполнения ядра ASP.Net.

Update:

Этот точный пример не работает для меня с основным ядром asp.net Dotnet и пустельга службы:

[Route("api/[controller]")] 
public class SampleController : Controller 
{ 
    // GET api/values/5 
    [HttpGet("{id}/{urlSuffix}")] 
    public object Get(string id, string urlSuffix) 
    { 
     return new {id, urlSuffix}; 
    } 
} 

Когда я называю http://localhost:5000/api/sample/some-id/folder я получаю правильный результат, но когда я звоню http://localhost:5000/api/sample/some-id/folder/subfolder/file.extension Я получаю ошибку 404.

ответ

1

Реферирование: Handling a Variable Number of Segments in a URL Pattern

Иногда приходится обрабатывать запросы URL, содержащие переменную количество сегментов URL. Когда вы определяете маршрут, вы можете указать, что , если URL-адрес имеет больше сегментов, чем в шаблоне, дополнительные сегменты считаются частью последнего сегмента. Для обработки дополнительных сегментов таким образом вы помечаете последний параметр звездочкой (*). Это называется параметром catch-all. Маршрут с параметром catch-all также будет соответствовать URL-адресам, которые не содержат любых значений для последнего параметра.

Ваш шаблон и заполнители изменится ...

[HttpGet("{id:guid}/{*urlSuffix}")] 

Учитывая следующий URL ...

"api/sample/123e4567-e89b-12d3-a456-426655440000/folder/subfolder/file.css" 

затем

  • id = 123e4567-e89b-12d3-a456-426655440000
  • urlSuffix = "folder/subfolder/file.css"

Поскольку / уже является частью шаблона, он будет исключен из параметра urlSuffix.

*urlSuffix действует как уловка за все после {id}/ в URL-адресе. Если есть дополнительные параметры запроса, они также будут включены в urlSuffix.

Вы получили ошибку не найденной, потому что ваш примерный URL-адрес не смог найти подходящий маршрут api/sample/{id}.

Включено ограничение маршрута :guid на основе вашего исходного примера, ожидающего Guid для параметра id.

Если id не будет Guid, вы всегда можете удалить ограничение, и оно будет работать для вашего обновленного примера.

+0

Ну, это проблема, это не работает для меня. Я пытался изменить много вещей, но я не мог заставить ваш пример работать - см. Мой обновленный вопрос. – peter

+0

Это расширение файла, которое вызывает проблему. – Nkosi

+0

Нет, это не так, если я пропущу расширение файла, я получаю ту же ошибку, что и '/', вызывающие его, и для которого я не знаю, как определить шаблон url, чтобы он смотрел только на префикс – peter