На контроллере ASP.NET Core 2.2 я пытался сгенерировать ссылку тремя способами:
var a = Url.Action(action: "GetContentByFileId", values: new { fileId = 1 });
var b = _linkGenerator.GetUriByAction(HttpContext, action: "GetContentByFileId", controller: "FileController", values: new { fileId = 1 });
var c = _linkGenerator.GetUriByAction(_httpContextAccessor.HttpContext, action: "GetContentByFileId", controller: "FileController", values: new { fileId = 1 });
Результат
In«a», используя Url.Action, я получаю правильную ссылку ...
В «b» и «c» я получаю нулевое значение и предоставляю те же данные ... Iдумаю.
Я ввожу LinkGenerator в контроллер, и он не равен нулю ...
Я также внедряю HttpContextAccessor и у меня при запуске:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
FileController равен :
[ApiVersion("1.0", Deprecated = false), Route("v{apiVersion}")]
public class FileController : Controller {
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly LinkGenerator _linkGenerator;
public FileController(IHttpContextAccessor httpContextAccessor, LinkGenerator linkGenerator) {
_httpContextAccessor = httpContextAccessor;
_linkGenerator = linkGenerator;
}
[HttpGet("files/{fileId:int:min(1)}")]
public async Task<IActionResult> GetContentByFileId(FileGetModel.Request request) {
// Remaining code
}
Чего мне не хватает?
Обновление
Мне удалосьчтобы указать на проблему, кроме суффикса контроллера, как ответил TanvirArjel.
Все URL верны, если я прокомментирую следующую строку кода:
[ApiVersion("1.0", Deprecated = false), Route("v{apiVersion}")]
Но если я добавлю предыдущую строку кода иследующее при запуске:
services.AddApiVersioning(x => {
x.ApiVersionSelector = new CurrentImplementationApiVersionSelector(x);
x.AssumeDefaultVersionWhenUnspecified = true;
x.DefaultApiVersion = new ApiVersion(1, 0);
x.ReportApiVersions = false;
});
Тогда URL-адреса становятся нулевыми ...
То, что добавляет ApiVersion, это "v1.0" перед файлами, поэтому оно становится "v1.0 / files".
Так что линkGenerator должен стать:
var b = _linkGenerator.GetUriByAction(HttpContext,
action: "GetContentByFileId",
controller: "File",
values: new { apiVersion = "1.0", fileId = 1
});
Вопрос
Есть ли способ интегрировать apiVersion в LinkGenerator, не указывая его?