- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在 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/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/
我试图对 ASP.Net MVC 有一个高层次的理解,我开始意识到它看起来很像原始的 ASP 脚本。过去,我们将“模型”/业务逻辑代码组织到 VBScript 类或 VB COM 组件中。 当然,现在
我已经搜索了一段时间,但似乎找不到答案。 我想在我的旋转木马中显示一个计数器,左边是当前项目(工作),左边是项目总数。 我的代码:
. 最佳答案 Scott Gu 称这些为代码块。这就是我的看法。 http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax
我有一个使用 Visual Studio 2010/.net 4/VB 制作的网站。 我真的很喜欢我发现的 FAQ 系统的布局,因为它很简单,但它是经典的 asp。所以,显然,我不能包括我的母版页布局
好吧,对于你们许多人来说,这个问题可能有一个非常明显的答案,但它让我难住了。 我有一个 asp.net Web 表单,上面有两个控件(嗯,不止这两个,但我们将重点关注这些) - 第一个是 asp:dr
当我将 ASP.NET 复选框控件设置为 asp.net 更新面板的异步回发触发器时,EventName 属性是什么? 最佳答案 我相信它是 CheckedChanged。 关于asp.net - a
我有一个用经典 asp 编写的(巨大的)网站。现在我必须切换到 vb.net (razor)。有没有办法将这两个结合起来直到切换完成? 有没有办法让应用程序与经典的 asp 和 vb.net 一起工作
I am creating a products page, where the user selects an option in a radiobuttonlist for example, an
我最近将一个经典的 ASP 应用程序转换为 ASP.NET 3.5,但我觉得我的经典 ASP 版本要快一些(我不知道可能买家会后悔)。 所以你们能帮我解决这个问题吗,让我知道哪个更快,asp、asp.
从本周开始,我被要求开始学习如何使用 ASP 开发网站。我通过 XNA 对 C# 有一定的经验,所以这部分对我来说并不是什么麻烦。 我一直在关注Music Store Tutorial这需要我设置一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我想将一些表单变量发布到经典 ASP 页面中。我不想改变经典的 ASP 页面,因为需要完成大量的工作,以及消耗它们的页面数量。 经典的 ASP 页面需要将表单变量 Username 和 Userpas
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在某种程度上,这可能是一个异端问题。我们有一个大型站点,其中许多页面仍在ASP中。通常,并没有真正动态的,而是包括(通过SSI或Server.Execute)定期重新生成的HTML块。看起来好像是一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有一个遗留的 ASP 应用程序——在不久的某个时候——需要迁移到 ASP.Net 2.0(以与也在 2.0 中的其他应用程序兼容)。 对于这类事情是否有最佳实践,即作为第一步将当前 html、vbs
我目前在一家公司工作,该公司使用 ASP.NET Webforms 和旧 ASP 页面的组合进行 Web 开发。这对于他们当前的项目来说效果很好,但我想说服/建议他们切换到 ASP.NET MVC,因
我有一个经典的 asp 应用程序。我想将该页面的竞赛表格发布到 Asp.Net 表格。原因是我想在进入数据库之前使用我在 Asp.Net 页面中内置的大量逻辑进行验证,而我对 asp 不太了解。更不用
我知道在 ASP.NET MVC 中,您可以拥有移动 View 并执行类似 Index.mobile.cshtml 的操作。和 _Layout.mobile.cshtml并且服务器知道将这些 View
我需要从一些服务器端 c#.net 代码中调用经典 asp 页面上的 VBscript 函数 - 有谁知道一种干净的方法来做到这一点?在 .net 中重写函数不是一种选择。 我会再解释一下这个问题..
我是一名优秀的程序员,十分优秀!