ASP.Net中用于非aspx文件扩展名的URL路由

时间:2019-02-19 16:10:26

标签: c# asp.net url-routing file-extension buildprovider

我正在尝试在ASP.Net中将URL路由用于非aspx文件扩展名

当我开始使用asp.net时,我的代码变得凌乱,并且在很多文件夹中结构化 隐藏我的目录路径并获得有意义的压缩URL URL路由 对此有很多建议,对我而言,最简单的教程是http://www.4guysfromrolla.com/articles/051309-1.aspx

默认情况下,URL路径显示我完整的文件夹结构,为了隐藏此信息,我使用URL路由 在执行以下代码后,我被允许对虚拟路径使用重定向

    RouteTable.Routes.Add("login", new Route("login", new RouteHandler(string.Format("~/…/Login.aspx"))));

如果您使用非.aspx文件扩展名(例如HTML),则需要在web.config中为该扩展名添加Buildproviders

示例:

RouteTable.Routes.Add("testhtml", new Route("testhtml", new RouteHandler(string.Format("~/.../test.html"))));

Web.Config:

  <system.web>
    <compilation debug="true" targetFramework="4.6.1" >
      <buildProviders >
        <add extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
      </buildProviders>
    </compilation>
<…>

现在http://localhost:58119/testhtmlhttp://localhost:58119/.../test.html相同,但具有完整的路径

我的问题

默认情况下,ASP.net可以重定向到〜/…/ test.pdf或〜/…/ test.png。

使用“ URL路由”,它再次要求提供文件扩展名的构建提供者。

但是如果我是正确的话,msdn文档中没有这些扩展的默认buildproviders:/

1 个答案:

答案 0 :(得分:0)

我自己弄清楚了。

要允许访问文件,必须使用Web.config中的Build Providers,但是如果您狂奔到文件,则默认情况下它们不会自动填充HTTP标头的Conten Type。 手动设置它,我使用了以下代码:

        RouteTable.Routes.Add("testpng", new Route("testpng", new CustomRouteHandler(string.Format("~/test.png"))));

public class CustomRouteHandler: IRouteHandler
{
    string _virtualPath;
    public CustomRouteHandler(string virtualPath)
    {
        _virtualPath = virtualPath;
    }
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {

        requestContext.HttpContext.Response.Clear();
        requestContext.HttpContext.Response.ContentType = GetContentType(_virtualPath);

        string filepath = requestContext.HttpContext.Server.MapPath(_virtualPath);
        requestContext.HttpContext.Response.WriteFile(filepath);
        requestContext.HttpContext.Response.End();
        return null;
    }
    private static string GetContentType(String path)
    {
        switch (System.IO.Path.GetExtension(path))
        {
            case ".pdf": return "application/pdf";
            case ".bmp": return "Image/bmp";
            case ".gif": return "Image/gif";
            case ".jpg": return "Image/jpeg";
            case ".png": return "Image/png";
            default: return "text/html";
        }
        //return "";
    }
}

所有允许的ContenTypes列表 http://www.iana.org/assignments/media-types/media-types.xhtml

Web.Config示例:

  <system.web>
    <compilation debug="true" targetFramework="4.6.1" >
      <buildProviders >
        <add extension=".CMDOC" type="System.Web.Compilation.PageBuildProvider"/>
        <add extension=".png" type="System.Web.Compilation.PageBuildProvider"/>
        <add extension=".pdf" type="System.Web.Compilation.PageBuildProvider"/>
      </buildProviders>
    </compilation>