簡體   English   中英

如何通過ASP.NET路由路由圖像?

[英]How do I route images through ASP.NET routing?

我想創建一個動態縮略圖大小調整器,以便您可以使用以下URL來獲取已調整大小的圖像:

http://server/images/image.jpg?width=320&height=240

我嘗試設置這樣的路線:

routes.MapRoute(null,
                "{filename}",
                new { controller = "Image", action = "Resize" });

但是,如果該文件存在於URL,則ASP.NET將繞過路由並僅返回文件。 如何強制ASP.NET路由圖像而不是返回磁盤上的內容?

為什么不使用動作來做到這一點? 控制器的動作可以回送圖像。 否則,使用ASPX的典型方法是處理程序或處理程序工廠偵聽文件擴展名並相應地處理它。 或者使用URL重寫來重寫請求中的URL。

多數民眾贊成如何運行asp.net路由,沒有其他...如果你想攔截現有文件的請求,你必須使用重寫。

更新

好像我在觸發器上有點太快了。 似乎有一個屬性可以設置,允許您甚至為現有文件強制執行路由。

RouteCollection.RouteExistingFiles屬性

http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx

獲取或設置一個值,該值指示ASP.NET路由是否應處理與現有文件匹配的URL。 如果ASP.NET路由處理所有請求,即使是與現有文件匹配的請求,則為True; 否則,錯誤。 默認值為false。

你也可以考慮:

  1. 編寫模塊以在路由到達之前處理這些圖像路由(在Web.Config中注冊)
  2. 編寫自己的路由處理程序專門處理這些圖像。

兩者都允許你刪除寫作控制器的需要,我認為這更清潔。

你自己的路由處理程序的非常基本的例子(來自內存)......

注冊為正常路線:

/* Register in routing */
routes.Add("MyImageHandler",
           new Route("my-custom-url/{folder}/{filename}", 
           new ImageRouteHandler())
);


/* Your route handler */
public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string filename = requestContext.RouteData.Values["filename"] as string;
        string folder = requestContext.RouteData.Values["folder"] as string;
        string width = requestContext.HttpContext.Request.Params["w"] as string;
        string height = requestContext.HttpContext.Request.Params["h"] as string;

        // Look up the file and handle and return, etc...
    }
}

希望這些幫助。 很多方法來擴展和實現:)

最簡單的方法是通過控制器路由所有圖像並將圖像存儲在單獨的位置

routes.MapRoute("Images",
            "/images/{filename}",
            new { controller = "Image", action = "Resize" });

/sitebase/images/image.jpg         //public image location
/sitebase/content/images/image.jpg //real image location

然后,您的控制器將查看正在請求的圖像,並從文件系統加載相應的文件。 這將允許您在沒有任何特殊處理的情況下執行您想要的操作。

怎么樣:

routes.MapRoute("Images",
        "/images/{filename}.jpg",
        new { controller = "Image", action = "Resize" });

這應該確保只有帶有.jpg作為擴展名的URL才能與該路由匹配並得到適當的路由。

另外請記住,您希望按照最具體到最不具體的順序添加您的操作,最后添加默認操作。

當然,您的操作仍然需要使用filecontentresult提供Image。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM