如何使用Windows Azure实现URL重写

本文关键字:URL 重写 实现 Azure 何使用 Windows | 更新日期: 2023-09-27 17:59:37

我有一个托管在Windows Azure上的ASP.NET/C#网站。该网站是一个基于预测的社交网站,主页上有预测摘要。如果你点击一个摘要,你会使用一个简单的QueryString重定向到该预测的详细信息页面。

例如:

http://www.ipredikt.com/details.aspx?id=14

这个特别的预测题为"Paris Hilton将获得诺贝尔和平奖",所以我想做的是Azure上为我的网站实现URL重写,如下所示:

http://www.ipredikt.com/predictions/14/paris-hilton-will-win-the-nobel-peace-prize

为此,有哪些策略和最佳实践?有人能给我指一两篇好的Azure特定文章吗。

连字符标题("paris hilton bla bla")实际上只是为了让URL更易于阅读;我不认为在加载页面方面会依赖它。事实上,我可能会允许重复标题,因为我将依赖URL中的预测ID。

编辑:

忘了提一下,我们不是基于MVC的。我们提出了自己的体系结构,使用PageMethods和WebMethods向客户端返回JSON。我们依靠ASP.NET AJAX来完成所有的JSON序列化,并且几乎所有的UI都是使用jQuery在客户端上动态构建的。

编辑:解决方案

我想既然我已经启动并运行了,我会分享我的解决方案。

我制作了一个新的课程如下(逐字逐句地从某处复制):

public class WebFormRouteHandler<T> : IRouteHandler where T : IHttpHandler, new()
{
   public string VirtualPath { get; set; }
   public WebFormRouteHandler(string virtualPath)
   {
      this.VirtualPath = virtualPath;
   }
   public IHttpHandler GetHttpHandler(RequestContext requestContext)
   {
      return (VirtualPath != null)
          ? (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(VirtualPath, typeof(T))
          : new T();
   }
}

我在Global.asax中添加了以下方法。实际的方法非常长(它覆盖了网站中的每一页)。你会看到,我支持用很多不同的方式调用预测页面:带id、带id+标题等。("…fb"版本的页面适用于我网站的Facebook应用程序版本,该版本使用不同的MasterPage。)

  public static void RegisterRoutes(RouteCollection routes)
  {
     // Details : 'predictions' Page
     var routeHandlerDetails = new WebFormRouteHandler<Page>("~/details.aspx");
     var routeHandlerDetailsFb = new WebFormRouteHandler<Page>("~/detailsfb.aspx");
     routes.Add(new Route("predictions/{id}", routeHandlerDetails));
     routes.Add(new Route("predictions/{id}/{title}", routeHandlerDetails));
     routes.Add(new Route("fb/predictions/{id}", routeHandlerDetailsFb));
     routes.Add(new Route("fb/predictions/{id}/{title}", routeHandlerDetailsFb));
   }

并且该方法是从Application_Start()调用的

  void Application_Start(object sender, EventArgs e)
  {
     RegisterRoutes(RouteTable.Routes);
  }

然后,我在system.webServer块的web.config中添加了以下内容:

   <!-- Added for URL Routing -->
   <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule"
           type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
   </modules>
    <!-- Added for URL Routing -->
    <handlers>
      <add name="UrlRoutingHandler"
           preCondition="integratedMode"
           verb="*"
           path="UrlRouting.axd"
           type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
   </handlers>

我还不得不将虚拟"预测"目录从身份验证中排除(因为我的非身份验证用户几乎可以访问我们网站的所有部分):

<!-- Url routing -->
<location path="predictions">
   <system.web>
      <authorization>
         <allow users="*" />
      </authorization>
   </system.web>
</location>

最后,我在加载页面时不再依赖QueryString字符串参数,所以我不得不编写一些新的助手方法。这是一个从新的路由URL中提取数值的方法(我将清理它,使其只有一个"返回"。):

  public static int GetRouteDataValueAsNumber(HttpRequest request, string propertyName)
  {
     if ((request == null) ||
         (request.RequestContext == null) ||
         (request.RequestContext.RouteData == null) ||
         (request.RequestContext.RouteData.Values[propertyName] == null))
     {
        return -1;
     }
     try
     {
        return System.Convert.ToInt32(request.RequestContext.RouteData.Values[propertyName]);
     }
     catch
     {
     }
     return -1;
  }

现在,当我需要读取路由值(比如预测ID)时,我会执行以下操作:

  long _predictionId = System.Convert.ToInt64(WebAppUtils.GetRouteDataValueAsNumber(Request, "id"));

效果很好!现在,我的网站感觉像是一个MVC应用程序,具有友好和自我文档化的URL。

哦,最后一件事,你还需要启用HTTP重定向,如下所示:

开始=>控制面板=>程序=>打开Windows功能=>Internet信息服务=>万维网服务=>常见HTTP功能=>(选中"HTTP重定向"复选框)。

如何使用Windows Azure实现URL重写

实现这一点的最简单方法是使用System.Web.Routing程序集的编程方法。

这基本上是通过在web.config中包含UrlRoutingModule,并定义基于匹配路由解析目标页面的模式来实现的。如果您熟悉ASP.NET MVC,那么您以前使用过这种路由策略,但MVC不是使用路由的必要条件。

以下是一些帮助您入门的资源:

  • System.Web.Routing命名空间的MSDN文档-官方文档

  • Scott Gu关于MVC的URL路由-*注意,本文解释了ASP.NET MVC应用程序上下文中的路由,然而,无论您是否使用MVC,相同的方法都会起作用

  • ASP.NET路由。。。再见URL重写,Chris Cavanagh-解释性文章

  • Justin Etheredge的《探索System.Web.Routing》——一个案例研究,解释如何独立于MVC架构使用路由

关于Windows Azure

如果你采用这种方法,你使用的是Windows Azure其实并不重要。然而,我发现Michael Kennedy的一篇文章名为ASP.NET Routing in Windows Azure Using WebForms,解释了如何在Windows Azure上轻松部署这样的解决方案。这篇文章甚至有一个可供下载的示例项目。

Azure web角色已安装IIS7 Url重写模块-http://msdn.microsoft.com/en-us/library/dd573358.aspx

此模块的"操作方法"位于http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

对于您的巴黎示例,您基本上需要设置一个映射url 的规则

http://www.ipredikt.com/predictions/14/paris-hilton-will-win-the-nobel-peace-prize

http://www.ipredikt.com/details.aspx?id=14

这类似于:

图案-

^predictions/([0-9]+)/([_0-9a-z-]+)

行动-

 details.aspx?id={R:1}

有关定义这些规则的详细信息,请参阅http://learn.iis.net/page.aspx/461/creating-rewrite-rules-for-the-url-rewrite-module/