[英]HttpHandler and Routes in ASP.NET MVC
在我正在工作的项目中,我编写了一个HttpHandler
来将响应图像作为响应而不是View ,就像这样:
using System;
using System.Web;
using System.Web.Routing;
using MyProject.Data;
using MyProject.Infrastructure;
namespace MyProject.HttpHandlers
{
public class PersonImageHttpHandler : IHttpHandler
{
public RequestContext RequestContext { get; set; }
public PersonImageHttpHandler(RequestContext requestContext)
{
RequestContext = requestContext;
}
/// <summary>
///
/// </summary>
public bool IsReusable
{
get { return false; }
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
var currentResponse = HttpContext.Current.Response;
currentResponse.ContentType = "image/jpeg";
currentResponse.Buffer = true;
var usuarioId = Convert.ToInt32(RequestContext.RouteData.GetRequiredString("id"));
try
{
var person = new People(GeneralSettings.DataBaseConnection).SelectPorId(usuarioId);
currentResponse.BinaryWrite(person.Thumbnail);
currentResponse.Flush();
}
catch (Exception ex)
{
context.Response.Write(ex.StackTrace);
}
}
}
}
这个HttpHandler
需要一个RouteHandler
:
using System.Web;
using System.Web.Routing;
using MyProject.HttpHandlers;
namespace MyProject.RouteHandlers
{
public class PersonImageRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new PersonImageHttpHandler(requestContext);
}
}
}
Routes.cs
是这样的:
using System.Web.Mvc;
using System.Web.Routing;
using MyProject.Helpers;
using MyProject.RouteHandlers;
namespace MyProject
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new Route("People/Thumbnail/{id}", new PersonImageRouteHandler()));
routes.MapRouteWithName(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
像访问以下地址的魅力一样工作
但每次我对此路由使用某些请求时, forms
中的actions
都不起作用,将POST请求重定向到此地址: http://mydomain.com/People/Thumbnail/1?action=Index&controller=AnotherController
: http://mydomain.com/People/Thumbnail/1?action=Index&controller=AnotherController
? actions
= http://mydomain.com/People/Thumbnail/1?action=Index&controller=AnotherController
。
怎么了?
正如@AlexeiLevenkov建议的那样,我放弃了混合路由方法并解决了如下实现PeopleController
问题:
public FileResult Thumbnail(int id)
{
var person = new People(GeneralSettings.DataBaseConnection).SelectById(id);
return File(person.Thumbnail, System.Net.Mime.MediaTypeNames.Image.Jpeg);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.