在特定URL上触发HttpHandler

时间:2014-08-01 10:55:10

标签: c# asp.net httphandler

当浏览器请求来自特定网址的内容时,我创建了一个HttpHandler

我尝试这样注册:

<system.webServer>
  <handlers>
    <clear />
      <add name="png" verb="GET,HEAD" path="*.png" type="MyProject.HttpHandler" />
      <add name="jpg" verb="GET,HEAD" path="*.jpg" type="MyProject.HttpHandler" />
      <add name="jpeg" verb="GET,HEAD" path="*.jpeg" type="MyProject.HttpHandler" />
      <add name="gif" verb="GET,HEAD" path="*.gif" type="MyProject.HttpHandler" />
  </handlers>
<system.webServer>

这适用于所有网址,除了我需要它处理的网址。我想要处理的请求是浏览器请求图像的时间。它看起来像这样:

http://example.net/contentassets/some_image_name.jpg?maybe=someParameters

由于某种原因,HttpHandler并没有接受这些。 基本上我想对HttpHandler的请求使用http://example.net/contentassets/...(这样它们只有在contentassets在URL中时才会触发)。有谁知道怎么做?

编辑:处理程序是否忽略查询字符串?

EDIT2:我们使用EPiServer作为CMS,因此从EPiServer blob存储中获取图像。存储位于项目文件夹中。这可能是问题所在。

2 个答案:

答案 0 :(得分:0)

路径元素似乎是一个掩码,你尝试过:

<add name="png" verb="GET,HEAD" path="*/contentassets/*.png" type="MyProject.HttpHandler" />

答案 1 :(得分:0)

所以,我明白了。 EPiServer有自己的处理程序来提供IContent,例如来自BLOB存储的图像。可以为特定的IContent类型创建自己的处理程序,从而覆盖EPiServers的默认实现。

以下是ContentMediaHttpHandler的实现,但设置为仅触发IContentImage(图片)。

[TemplateDescriptor(Inherited = true, TemplateTypeCategory = TemplateTypeCategories.HttpHandler)]
public class ImageResizeHandler : BlobHttpHandler, IRenderTemplate<IContentImage>
{
    protected override Blob GetBlob(HttpContextBase httpContext)
    {
       //This the implementation from ContentMediaHttpHandler
       var downLoadFileName = httpContext.Request.RequestContext.GetCustomRouteData<string>(DownloadMediaRouter.DownloadSegment);
       if (!string.IsNullOrEmpty(downLoadFileName))
       {
           httpContext.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", downLoadFileName));
       }

       var routeHelper = ServiceLocator.Current.GetInstance<ContentRouteHelper>();
       var binaryStorable = routeHelper.Content as IBinaryStorable;

       return binaryStorable != null ? binaryStorable.BinaryData : null;
    }
}