gpt4 book ai didi

http - 使用 HTTP 模块在 ASP.NET 3.5 和 IIS 7 中重写 URL

转载 作者:可可西里 更新时间:2023-11-01 16:06:58 24 4
gpt4 key购买 nike

我正在 ASP.NET 3.5 和 IIS 7 中开发应用程序。我编写了一个 HTTP 模块来执行 URL 重写,例如,我想将用户名重写为帐户 ID“~/Profiles/profile.aspx? AccountID="+ account.AccountID.ToString();

见下文:

使用系统;使用 System.Collections.Generic;使用系统数据;使用系统配置;使用 System.IO;使用 System.Linq;使用 System.Web;使用 System.Web.Security;使用 System.Web.UI;使用 System.Web.UI.HtmlControls;使用 System.Web.UI.WebControls;使用 System.Web.UI.WebControls.WebParts;使用 System.Xml.Linq;

public class UrlRewrite : IHttpModule
{
private AccountRepository _accountRepository;
private WebContext _webContext;

public UrlRewrite()
{
_accountRepository = new AccountRepository();
_webContext = new WebContext();
}

public void Init(HttpApplication application)
{
// Register event handler.
application.PostResolveRequestCache +=
(new EventHandler(this.Application_OnAfterProcess));
}

public void Dispose()
{
}

private void Application_OnAfterProcess(object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;

string[] extensionsToExclude = { ".axd", ".jpg", ".gif", ".png", ".xml", ".config", ".css", ".js", ".htm", ".html" };
foreach (string s in extensionsToExclude)
{
if (application.Request.PhysicalPath.ToLower().Contains(s))
return;
}

if (!System.IO.File.Exists(application.Request.PhysicalPath))
{
if (application.Request.PhysicalPath.ToLower().Contains("blogs"))
{

}
else if (application.Request.PhysicalPath.ToLower().Contains("forums"))
{

}
else
{

string username = application.Request.Path.Replace("/", "");

Account account = _accountRepository.GetAccountByUsername(username);

if (account != null)
{
string UserURL = "~/Profiles/profile.aspx?AccountID=" + account.AccountID.ToString();
context.Response.Redirect(UserURL);
}
else
{
context.Response.Redirect("~/PageNotFound.aspx");
}
}
}
}
}

我知道我需要在 web.config 中引用此处理程序才能使其正常工作,但我不知道我需要在 web.config 文件中输入什么以及在何处输入。有人可以在这里帮助我吗?另外,是否需要任何其他配置才能使其正常工作?我需要配置 IIS 吗?

提前致谢。

问候

沃尔特

最佳答案

取决于您使用的是 IIS7 经典模式还是集成管道模式。使用集成管道模式执行此操作的标准方法如下:

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewrite" type="MyLibrary.UrlRewrite" />
</modules>
</system.webServer>

但为了安全起见,您可能希望在 IIS5/6 上支持 IIS7 Classic/Integrated 与优雅降级的组合(以防您的开发箱使用不同的操作系统),Rick Strahal建议在 web 配置中使用以下代码来支持两者并绕过 IIS 抛出的讨厌的错误,如果你让它向后兼容的话:

<system.web>
<httpModules>
<add name="UrlRewrite" type="MyLibrary.UrlRewrite" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewrite" type="MyLibrary.UrlRewrite" />
</modules>
</system.webServer>

您还会注意到添加了 runAllManagedModulesForAllRequest="true",这是相关的,否则您的 HttpModule 中的代码只会在浏览器调用 .aspx、.ashx、.asmx 等文件时执行,这些文件由.NET 框架。

此外,为了真正重写 url(而不是重定向用户),您需要在事件处理程序中使用 context.RewritePath(string) 方法。

它的工作方式是 application.Request.Path 带有一个“友好”字符串,我想它在您的应用程序中看起来像这样:

http://www.domain.com/robertp

重写如下:

http://www.domain.com/Profiles/profile.aspx?AccountID=59

要执行此操作而不是使用 context.Response.Redirect(),您需要使用 context.RewritePath(),如下所示:

string UserURL = "~/Profiles/profile.aspx?AccountID=" + account.AccountID.ToString();
context.RewritePath(UserURL);

...多田!!

这应该确保传递给服务器的 url 是带有 profiles.aspx?AccountID=59 的 url,同时用户在他们的网站上获得更友好的 robertp浏览器。

至于配置选项,只要您坚持使用 IIS7,您就可以使用上面的 Web 配置设置。当您尝试在运行 IIS6 或 IIS5 的 Dev PC 上进行测试时,您可能会遇到问题,这通常围绕着 robertp 没有可识别的文件扩展名,因此您的 HttpModule 代码不会执行,除非您添加使用 .NET ISAPI 的文件扩展名。

希望有用。

关于http - 使用 HTTP 模块在 ASP.NET 3.5 和 IIS 7 中重写 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com