url重写模块中的自定义提供程序

时间:2014-06-27 09:54:15

标签: azure url-rewrite-module

我正在一个网站上开发,该网站目前在VM上托管在Azure上。现在我正在更改此网站,以便能够将其作为Azure网站运行。

现在我的问题: 我正在使用IIS中的url rewrite模块和数据库提供程序,它在VM中运行良好。使用数据库提供者,网站的用户可以创建自己的简单重写规则。

但是当我将我的网站上传为Azure网站并访问数据库中指定的网址时,我收到错误消息:

  

“由于发生内部服务器错误,无法显示页面。”。

这是我目前使用的日志配置:

<rewrite>
  <rules configSource="RewriteInbound_Live.config" />
  <outboundRules configSource="RewriteOutbound_Live.config" />
  <providers>
    <provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f">
      <settings>
        <add key="ConnectionString" value="*****" />
        <add key="StoredProcedure" value="sp_GetRewrittenUrl" />
        <add key="CacheMinutesInterval" value="60" />
      </settings>
    </provider>
  </providers>
</rewrite>

我已经打开了网络服务器日志记录,它没有给我任何信息,我启用了应用程序日志记录,但也没有给我任何信息。

我的问题是,是否可以在Azure中使用自定义提供程序用于url rewite模块,这可以通过其他方式实现吗?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题:DbProvider在azure web app中不可用。因此,我保留了web.config中未覆盖的大部分网址重写内容,并将基于数据库的规则移至global.asax文件的Application_BeginRequest方法。

对于重定向规则,只需使用Response.Redirect或适当的Redirect301实施。另一方面,对于重写,请使用HttpContext.Current.RewritePath.

您应该添加一个缓存机制,以减少对DB的重复查询:

void Application_BeginRequest(Object sender, EventArgs e)
{
    //TODO: Cache sql queries
    string requestUrl = Request.FilePath;
    using (DBConn conn = new DBConn("GetRedirectUrl"))
    {
        conn["input"] = requestUrl;
        string res = conn.ExecuteScalar()?.ToString();

        if (!string.IsNullOrEmpty(res))
        {
            Response.Redirect301(res);
        }
    }


    //TODO: Cache sql queries
    using (DBConn conn = new DBConn("GetRewrittenUrl"))
    {
        conn["input"] = requestUrl;
        string res = conn.ExecuteScalar()?.ToString();

        if (!string.IsNullOrEmpty(res))
        {
            HttpContext.Current.RewritePath(res);
        }
    }
}