Использовать перенаправление в контроллере Web Api (HTTP 302 найдено)

По какой-то причине у меня много проблем, пытаясь выяснить, как перенаправить (HTTP 302 Found) на абсолютный URL из контроллера.

Я попробовал это:

this.Redirect("/assets/images/avatars/profile.jpg");

Но я получаю исключение

Возникло исключение: System.UriFormatException в System.dll

Дополнительная информация: Неверный URI: невозможно определить формат URI.

Любой другой ответ, который я вижу здесь, кажется, не доступен для меня. я использую Web API а также MVC 5,

2 ответа

Решение

С RedirectВам необходимо отправить действительный URI, В вашем случае, если вы хотите вернуть только relative URIВы должны сказать это URI class:

public IHttpActionResult Get()
{
    return Redirect(new Uri("/assets/images/avatars/profile.jpg", UriKind.Relative));
}

В.NET Core 2.1 и, возможно, более низкой версии.NET Core вы не можете передать Uri. Поэтому вы должны создать Uri и вызвать метод.ToString().

Вот так.

 [HttpGet]
 public IActionResult Get()
 {
        Uri url = new Uri("../Path/To/URI", UriKind.Relative);
        return Redirect(url.ToString());
 }

С моей точки зрения, это какой-то бессмысленный недостаток. Метод перенаправления.Net Framework Web Api Redirect не поддерживает получение строки пути uri в качестве местоположения.

Итак, вы должны делать то, что говорит этот ответ.

Но вместо того, чтобы делать это каждый раз, когда вам нужно перенаправить, лучше исправить этот API:

/// <inheritdoc />
protected override RedirectResult Redirect(string location)
{
    // The original version just crash on location not supplying the server name,
    // unless who asked it to please consider the possibility you do not wish to tell
    // it every time you have a redirect to "self" to do.
    return base.Redirect(new Uri(location, UriKind.RelativeOrAbsolute));
}

Я вставляю это в свой базовый контроллер, поэтому могу забыть об этом недостатке.

Другие вопросы по тегам