asp.net mvc 2.0: запрос маршрута к статическому ресурсу - PullRequest
3 голосов
/ 17 января 2011

Я хочу направить HTTP-запросы не в действие, а в файл.

Важно: У меня действительно есть работающее решение, использующее модуль перезаписи URL IIS 7.0, но для отладки дома (без IIS 7.0) я не могу использовать перезапись URL.

Особая ситуация
Я хочу указать любой URL-адрес, содержащий /images/, в папку ~/images/.

Пример:

http://wowreforge.com/images/a.png -> /images/a.png
http://wowreforge.com/Emerald Dream/Jizi/images/a.png -> /images/a.png
http://wowreforge.com/US/Emerald Dream/Jizi/images/a.png -> /images/a.png
http://wowreforge.com/characters/view/images/a.png -> /images/a.png

Проблема связана с тем, что на страницу «view_character.aspx» можно попасть с нескольких URL-адресов:

http://wowreforge.com/?name=jizi&reaml=Emerald Dream
http://wowreforge.com/US/Emerald Dream/Jizi

Контекст IIS 7.0 (интегрированный режим), ASP.NET MVC 2.0

Дополнительные кредитные вопросы

  • Является ли плохой идеей использовать ASP.NET MVC маршрутизацию в этой ситуации вместо перезаписи URL?
  • Какой обработчик IIS 7.0 направляет запросы в физические файлы?

1 Ответ

3 голосов
/ 17 января 2011

Возможно, вам следует переписать ваши ссылки на изображения для.

<img src="<%= ResolveUrl("~/images/a.png") %>" />

Таким образом, вам не нужно, чтобы ваши маршруты обрабатывали изображения.

ОБНОВЛЕНИЕ Как вы это сделаете, добавив эту запись в свой RouteTable

routes.Add("images", new Route("{*path}", null, 
   new RouteValueDictionary(new { path = ".*/images/.*"}), 
   new ImageRouteHandler()));

Теперь вам нужно создать ImageRouteHandler и ImageHandler

public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        //you'll need to figure out how to get the physical path
        return new ImageHandler(/* get physical path */);
    }
}

public class ImageHandler : IHttpHandler
{
    public string PhysicalPath { get; set; }

    public ImageHandler(string physicalPath)
    {
        PhysicalPath = physicalPath;
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.TransmitFile(PhysicalPath);
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

Это также не выполняет никакого кэширования.Вы можете проверить System.Web.StaticFileHandler в Reflector для обработчика, который обрабатывает статические файлы для приложения Asp.Net для более полной реализации.

...