Обходной путь слишком длинный ReturnUrl
параметр querystring. Дело в том, что, если в добавлении добавлялось новое значение параметра RedirectUrl
(например, с использованием метода FormsAuthentication.RedirectToLoginPage
), это было бы закодировано и назначено новому параметру RedirectUrl
.
Идея состоит в том, чтобы удалить ненужные (старые параметры ReturnUrl
из строки запроса). Для этого я использую Application_EndRequest
в global.asax
и Response.RedirectLocation
.
Так что если ответ перенаправляется и текущий url содержит ReturnUrl
параметр, его следует удалить из перенаправленного местоположения (потому что это не имеет смысла).
// parameter key
private static readonly string ReturnUrlParameter = "ReturnUrl";
protected void Application_EndRequest(object sender, EventArgs e)
{
if (Response.IsRequestBeingRedirected)
{
Uri redirectUrl;
if (Uri.TryCreate(Response.RedirectLocation, UriKind.RelativeOrAbsolute, out redirectUrl))
{
redirectUrl = MakeAbsoluteUriIfNecessary(redirectUrl);
Uri currentUrl = Request.Url;
var currentQueryParameters =
HttpUtility.ParseQueryString(HttpUtility.UrlDecode(currentUrl.Query));
// the parameter is present in the current url already
if (currentQueryParameters[ReturnUrlParameter] != null)
{
UriBuilder builder = new UriBuilder(redirectUrl);
builder.Query =
HttpUtility.UrlDecode(builder.Query)
.Replace(Request.Url.Query, string.Empty).TrimStart('?');
Response.RedirectLocation =
Request.Url.MakeRelativeUri(builder.Uri).ToString();
}
}
}
}
private Uri MakeAbsoluteUriIfNecessary(Uri url)
{
if (url.IsAbsoluteUri)
{
return url;
}
else
{
Uri currentUrl = Request.Url;
UriBuilder builder = new UriBuilder(
currentUrl.Scheme,
currentUrl.Host,
currentUrl.Port
);
return new Uri(builder.Uri, url);
}
}
Для URL разборе и строительство System.Uri
будет лучшим выбором.
URI, представляет собой компактное представление ресурса, доступного для вашего приложения в интрасети или Интернете. Класс Uri определяет свойства и методы обработки URI, и , в том числе анализ, сравнение и комбинирование . Свойства класса Uri доступны только для чтения; до создать модифицируемый объект, используйте класс UriBuilder .
Я просмотрел System.Uri. К сожалению, несмотря на то, что часть повтора повторяется, uri все еще хорошо сформирован. – DenaliHardtail