2010-10-30 68 views
0

也許我在尋找錯誤的東西或試圖以錯誤的方式實現。我使用通用處理程序動態生成圖像。C#ASP.NET MVC2路由通用處理程序

ImageHandler.ashx?width=x&height=y 

我寧願訪問使用我的東西像處理

images/width/height/imagehandler 

這是可能的我在谷歌找到了幾個例子,不與MVC2工作:我可以使用當前訪問我的處理程序。

乾杯。

回答

5

昨晚我繼續研究這個問題,令我驚訝的是我更接近我曾想過的解決方案。對於任何可能在將來遇到此問題的人來說,我都是如何將MVC2路由實現到通用處理程序的。

首先,我創建了一個繼承IRouteHandler

public class ImageHandlerRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var handler = new ImageHandler(); 
     handler.ProcessRequest(requestContext); 

     return handler; 
    } 
} 

然後我實現了通用處理器創建一個MVC友好的ProcessRequest類。

public void ProcessRequest(RequestContext requestContext) 
{ 
    var response = requestContext.HttpContext.Response; 
    var request = requestContext.HttpContext.Request; 

    int width = 100; 
    if(requestContext.RouteData.Values["width"] != null) 
    { 
     width = int.Parse(requestContext.RouteData.Values["width"].ToString()); 
    } 

    ... 

    response.ContentType = "image/png"; 
    response.BinaryWrite(buffer); 
    response.Flush(); 
} 

然後添加一個路由在Global.asax

RouteTable.Routes.Add(
    new Route(
     "images/{width}/{height}/imagehandler.png", 
     new ImageShadowRouteHandler() 
    ) 
); 

那麼你可以使用

<img src="/images/100/140/imagehandler.png" /> 

我使用的通用處理器在需要時生成動態水印調用處理。希望這可以幫助別人。

如果您有任何問題,請告訴我,我會盡可能幫助您。

+0

太棒了。這對我有效。唯一的是,在你的代碼中添加到Global.asax時,你應該提到ImageShadowRouteHandler,它應該是ImageHandlerRouteHandler – wozza 2011-05-31 03:54:44

+0

真的很好的解決方案。我喜歡它,而不需要管理控制器遺留處理程序的代碼。 – 2011-12-15 07:30:57

0

我現在使用很長一段時間的解決方案,你可以把它通用的,所以它會接受你就必須在未來的任何處理程序:

internal class RouteGenericHandler<T> : IRouteHandler where T : IHttpHandler, new() 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new T(); 
    } 
} 

而上的RegisterRoutes方法:

routes.Add(new Route("Name", new RouteGenericHandler<TestHandler>()));