在 Web Api 控制器中使用重定向(发现 HTTP 302)

Use Redirect in Web Api Controller (HTTP 302 Found)

出于某种原因,我在尝试找出如何从控制器中重定向 (HTTP 302 Found) 到绝对 URL 时遇到了很多麻烦。

我试过这个:

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

但是我抛出异常

Exception thrown: 'System.UriFormatException' in System.dll

Additional information: Invalid URI: The format of the URI could not be determined.

我在这里看到的所有其他答案似乎都对我不可用。我正在使用 Web APIMVC 5.

使用Redirect,您需要发送一个有效 URI。在你的情况下,如果你只想 return 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 重定向方法不支持获取 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));
}

我把它放在我的基本控制器中,所以可以忘记这个缺点。