Маршрутизация URL в ASP.Net для расширений не aspx - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь использовать URL-маршрутизацию в ASP.Net для расширений файлов не 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, вам нужно добавить Buildproviders в web.config для этого расширения

Пример:

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/testhtml совпадает с http://localhost:58119/.../test.html с полным путем

На мой вопрос

По умолчанию ASP.net может перенаправить на ~ /… / test.pdf или ~ /… / test.png.

с URL-адресом. Маршрутизация снова запрашивает buildproviders.для расширения файла.

Но в документации по msdn нет сборщиков по умолчанию для этих расширений, если я прав: /

1 Ответ

0 голосов
/ 22 февраля 2019

Я выяснил это сам.

Поставщики сборки в Web.config необходимы для разрешения доступа к файлу, но по умолчанию они не заполняют 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>
...