LinkGenerator возвращает NULL Url, а Url.Action не ... Почему - PullRequest
0 голосов
/ 22 января 2019

На контроллере 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, не указывая его?

1 Ответ

0 голосов
/ 22 января 2019

Проблема в том, что вы используете имя контроллера с суффиксом Controller. Удалите суффикс Controller из имени контроллера и напишите следующее:

var b = _linkGenerator.GetUriByAction(HttpContext, 
    action: "GetContentByFileId", 
    controller: "File", 
    values: new { FileId = 1 }
);

Теперь это должно работать.

...