检测 URL 重定向 + ASP.NET 核心
Detect URL redirection + ASP.NET Core
我正在尝试将网络表单 URL 重定向到 .net Core。
假设用户在 URL 中输入 www.test.com/index.aspx,它将重定向到 www.test.com/home/index
那么在HomeController, IActionResult Index 方法中,如何检测它是从index.aspx 重定向到home/index?
我的研究表明它会像下面这样,但它们与 .net 核心不兼容
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "HEAD";
request.AllowAutoRedirect = false;
string location;
using (var response = request.GetResponse() as HttpWebResponse)
{
location = response.GetResponseHeader("Location");
}
感谢帮助。
您的代码与 .Net Core 1.1 不兼容,但与 .Net Core 2.0 兼容。因此,如果可能,只需更改目标框架。
您还应该稍微调整一下代码。在 .Net Core 中,如果发生重定向,HttpWebRequest.GetResponse()
方法将抛出 WebException
。所以你应该尝试捕捉它并分析 WebException.Response
:
try
{
using (request.GetResponse() as HttpWebResponse)
{
}
}
catch (WebException e)
{
var location = e.Response.Headers["Location"];
}
不过我建议使用 HttpClient
作为替代。它将允许您在没有异常处理的情况下完成工作:
using (HttpClientHandler handler = new HttpClientHandler())
{
handler.AllowAutoRedirect = false;
using (HttpClient httpClient = new HttpClient(handler))
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, uri))
using (var response = await httpClient.SendAsync(request))
{
var location = response.Headers.Location;
}
}
HttpClient
方法适用于 .Net Core 1.1 和 2.0 版本。
更新
HttpResponseMessage
中没有类似于 IsRedirected
属性 的内容,但您可以使用简单的扩展方法:
public static class HttpResponseMessageExtensions
{
public static bool IsRedirected(this HttpResponseMessage response)
{
var code = response.StatusCode;
return code == HttpStatusCode.MovedPermanently || code == HttpStatusCode.Found;
}
}
bool redirected = response.WasRedirected();
我正在尝试将网络表单 URL 重定向到 .net Core。 假设用户在 URL 中输入 www.test.com/index.aspx,它将重定向到 www.test.com/home/index
那么在HomeController, IActionResult Index 方法中,如何检测它是从index.aspx 重定向到home/index?
我的研究表明它会像下面这样,但它们与 .net 核心不兼容
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "HEAD";
request.AllowAutoRedirect = false;
string location;
using (var response = request.GetResponse() as HttpWebResponse)
{
location = response.GetResponseHeader("Location");
}
感谢帮助。
您的代码与 .Net Core 1.1 不兼容,但与 .Net Core 2.0 兼容。因此,如果可能,只需更改目标框架。
您还应该稍微调整一下代码。在 .Net Core 中,如果发生重定向,HttpWebRequest.GetResponse()
方法将抛出 WebException
。所以你应该尝试捕捉它并分析 WebException.Response
:
try
{
using (request.GetResponse() as HttpWebResponse)
{
}
}
catch (WebException e)
{
var location = e.Response.Headers["Location"];
}
不过我建议使用 HttpClient
作为替代。它将允许您在没有异常处理的情况下完成工作:
using (HttpClientHandler handler = new HttpClientHandler())
{
handler.AllowAutoRedirect = false;
using (HttpClient httpClient = new HttpClient(handler))
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, uri))
using (var response = await httpClient.SendAsync(request))
{
var location = response.Headers.Location;
}
}
HttpClient
方法适用于 .Net Core 1.1 和 2.0 版本。
更新
HttpResponseMessage
中没有类似于 IsRedirected
属性 的内容,但您可以使用简单的扩展方法:
public static class HttpResponseMessageExtensions
{
public static bool IsRedirected(this HttpResponseMessage response)
{
var code = response.StatusCode;
return code == HttpStatusCode.MovedPermanently || code == HttpStatusCode.Found;
}
}
bool redirected = response.WasRedirected();