ASP Net Core Атрибут маршрутизации и двойной слеш - PullRequest
0 голосов
/ 09 мая 2018

Как указано здесь , наличие двойной косой черты в URL допустимо.

У меня есть проект ASP Net Core, в котором используется атрибутная маршрутизация, контроллер с именем GroupController для обработки операций на Group с и действие для PUT ting RulePart с группы, указанной в ImportId типа string.

[Route("/api/[controller]")]
public class GroupController : ControllerBase
{
    [HttpPut("{groupImportId?}/ruleParts")]
    public async Task<IActionResult> PutRuleParts(string groupImportId, [FromBody]List<RulePartDto> ruleParts)
    {
        return null; //actual code ommitted for brevity
    }
}

URL-адрес, подобный http://localhost/api/group/groupImportId/ruleParts, соответствует ожидаемому.

Я бы ожидал, что нулевые groupImportId s, то есть URL-адреса, такие как http://localhost/api/group//ruleParts, будут вызывать это же действие, поскольку параметр маршрута groupImportId был помечен как необязательный. Однако при попытке вызвать этот URL-адрес появляется ошибка 404, и действие не выполняется.

Есть ли возможность сопоставить пустой сегмент пути URL в ASP Net Core?

1 Ответ

0 голосов
/ 09 мая 2018

Не используйте дополнительный параметр в середине шаблона маршрута.

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

Вместо этого атрибут маршрутизации позволяет сопоставить несколько маршрутов одному и тому же действию.

[HttpPut("ruleParts")] // PUT api/group/ruleParts
[HttpPut("{groupImportId}/ruleParts")] //PUT api/group/123456/ruleParts
public async Task<IActionResult> PutRuleParts([FromBody]List<RulePartDto> ruleParts, string groupImportId = null) {
    //...
}

Аргумент groupImportId действия сделан необязательным, чтобы позволить опциональному параметру быть пропущенным в URL при запросе другого маршрута.

Ссылка Маршрутизация к действиям контроллера в ASP.NET Core

...