Как я направляю изображения с помощью ASP.NET маршрутизация MVC?

Помните, используйте timeit модуль для тестирования, какой из маленьких отрывков кода быстрее!

$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop

Лично, я всегда использую .range(), если я не имел дело с действительно огромные списки - как Вы видите, мудрый временем, для списка миллиона записей, дополнительные издержки составляют только 0,04 секунды. И поскольку Corey указывает, в Python 3.0 .xrange() уйдет, и .range() даст Вам хорошее поведение итератора так или иначе.

35
задан womp 29 July 2009 в 01:49
поделиться

2 ответа

Вы не можете сделать это "из коробки" с фреймворк MVC. Помните, что есть разница между маршрутизацией и перезаписью URL. Маршрутизация - это отображение каждого запроса на ресурс, а ожидаемый ресурс - это фрагмент кода.

Однако гибкость инфраструктуры MVC позволяет вам делать это без каких-либо серьезных проблем. По умолчанию, когда вы вызываете routes.MapRoute () , он обрабатывает запрос с экземпляром MvcRouteHandler () . Вы можете создать пользовательский обработчик для обработки URL-адресов изображений.

  1. Создайте класс, который может быть назван ImageRouteHandler, который реализует IRouteHandler .

  2. Добавьте сопоставление в ваше приложение следующим образом :

    routes.Add ("ImagesRoute", new ImageRouteHandler ()));

  3. Вот и все.

Вот как выглядит ваш класс IRouteHandler :

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Compilation;
using System.Web.Routing;
using System.Web.UI;

namespace MvcApplication1
{
    public class ImageRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            string filename = requestContext.RouteData.Values["filename"] as string;

            if (string.IsNullOrEmpty(filename))
            {
                // return a 404 HttpHandler here
            }
            else
            {
                requestContext.HttpContext.Response.Clear();
                requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString());

                // find physical path to image here.  
                string filepath = requestContext.HttpContext.Server.MapPath("~/test.jpg");

                requestContext.HttpContext.Response.WriteFile(filepath);
                requestContext.HttpContext.Response.End();

            }
            return null;
        }

        private static string GetContentType(String path)
        {
            switch (Path.GetExtension(path))
            {
                case ".bmp": return "Image/bmp";
                case ".gif": return "Image/gif";
                case ".jpg": return "Image/jpeg";
                case ".png": return "Image/png";
                default: break;
            }
            return "";
        }
    }
}
50
ответ дан 27 November 2019 в 07:11
поделиться

Если бы вы сделали это с помощью веб-форм ASP.NET 3.5 Sp1, вам пришлось бы создать отдельный ImageHTTPHandler, который реализует IHttpHandler для обработки ответа. По сути, все, что вам нужно сделать, это поместить код, который в настоящее время находится в методе GetHttpHandler, в метод ProcessRequest вашего ImageHttpHandler. Я бы также переместил метод GetContentType в класс ImageHTTPHandler. Также добавьте переменную для хранения имени файла.

Тогда ваш класс ImageRouteHanlder будет выглядеть так:

public class ImageRouteHandler:IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            string filename = requestContext.RouteData.Values["filename"] as string;

            return new ImageHttpHandler(filename);

        }
    } 

, а ваш класс ImageHttpHandler будет выглядеть так:

 public class ImageHttpHandler:IHttpHandler
    {
        private string _fileName;

        public ImageHttpHandler(string filename)
        {
            _fileName = filename;
        }

        #region IHttpHandler Members

        public bool IsReusable
        {
            get { throw new NotImplementedException(); }
        }

        public void ProcessRequest(HttpContext context)
        {
            if (string.IsNullOrEmpty(_fileName))
            {
                context.Response.Clear();
                context.Response.StatusCode = 404;
                context.Response.End();
            }
            else
            {
                context.Response.Clear();
                context.Response.ContentType = GetContentType(context.Request.Url.ToString());

                // find physical path to image here.  
                string filepath = context.Server.MapPath("~/images/" + _fileName);

                context.Response.WriteFile(filepath);
                context.Response.End();
            }

        }

        private static string GetContentType(String path)
        {
            switch (Path.GetExtension(path))
            {
                case ".bmp": return "Image/bmp";
                case ".gif": return "Image/gif";
                case ".jpg": return "Image/jpeg";
                case ".png": return "Image/png";
                default: break;
            }
            return "";
        }

        #endregion
    }
6
ответ дан 27 November 2019 в 07:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: