在编写http处理程序/模块时,有一个实现的接口成员叫做bool IsReusable.
这个成员有什么意义?如果我将其设置为false(或true),这对于其他Web应用程序意味着什么?
我正在写一个IHttpHandler,我需要实现一个IsReusable属性.当我查看MSDN文档时,它说:
获取一个值,该值指示另一个请求是否可以使用IHttpHandler实例.
这不是很有帮助.在哪种情况下我应该使用可重用的处理程序,在哪种情况下它不应该是可重用的?
跟进问题:
Reusable = true吗?ASP.NET中的HttpHandler是什么?为什么以及如何使用它?
我有一个ASP.Net单文件Web服务(.ashx包含IHttpHandler实现的文件),它需要能够将错误返回为具有500个内部服务器错误状态代码的响应.这在PHP中是相对简单的事情:
header("HTTP/1.1 500 Internal Server Error");
header("Content-Type: text/plain");
echo "Unable to connect to database on $dbHost";
Run Code Online (Sandbox Code Playgroud)
ASP.Net(C#)等效应该是:
Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
Context.Response.ContentType = "text/plain";
Context.Response.Write("Unable to connect to database on " + dbHost);
Run Code Online (Sandbox Code Playgroud)
当然,这不能按预期工作; 相反,IIS拦截500状态代码,删除我写入Response对象的任何内容,并发送调试信息或自定义错误页面,具体取决于应用程序的配置方式.
我的问题 - 我怎样才能抑制这种IIS行为并直接从我的IHttpHandler实现中发送错误信息?
这个应用程序是PHP的一个端口; 客户端已经写好了,所以我基本上坚持这个规范.错误地发送200状态代码的错误不适合模具.
理想情况下,我需要以编程方式控制行为,因为这是我们要分发的SDK的一部分,而没有任何" 编辑此文件 "和" 更改此IIS设置 "补充说明.
谢谢!
编辑:已排序.Context.Response.TrySkipIisCustomErrors = true是票.哇.
我正在尝试一些值存储在会话从处理程序页面,我做一个重定向到一个页面的WebForms,这将拿起之前会话值和预填的WebForm:
public class Handler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
...
context.Session["StackOverflow"] = "overflowing";
context.Response.Redirect("~/AnotherPage.aspx");
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
除了context.Sessionobject是null.
如何从处理程序访问会话状态?
我正在尝试使用自定义处理程序来处理ASP.NET 3.5中的特定URL(或一组URL).
处理程序实际上并没有做任何重要的事情 - 它只是记录请求.我可以发布代码,如果有任何相关的东西,但我真的不认为它被调用.(特别是,对于正常的异常,我得到一个自定义错误页面并记录...这里我只是得到了香草IIS 404.)
这是web.config文件的相关位:
<system.web>
<httpHandlers>
<add verb="GET,POST" path="*.robot" validate="false"
type="CSharpInDepth.Wave.RobotHandler, CSharpInDepth"/>
</httpHandlers>
</system.web>
Run Code Online (Sandbox Code Playgroud)
(显然,该部分还有其他内容,但我不认为这是相关的.)
在本地,在开发服务器下运行,它工作正常.在我的真实盒子上,我总是得到一个404.网站目录下的一切都是一样的(通过svn复制).这包括我已验证包含的bin目录.CSharpInDepth.dllCSharpInDepth.Wave.RobotHandler
我尝试获取http://csharpindepth.com/foo.robot并获得404.
我已尝试使用和不使用程序集名称,特定URL或通配符......没有任何工作.
我确定我在IIS配置中的某个地方错过了一些简单的标志,但是如果我能找到它,我就会被炸毁......
编辑:这是IIS版本6.现在尝试将*.robot添加到ISAPI过滤器...
我有一些使用普通旧IHttpHandler的REST服务.我想生成更干净的URL,以便我在路径中没有.ashx.有没有办法使用ASP.NET路由创建映射到ashx处理程序的路由?我以前见过这些类型的路线:
// Route to an aspx page
RouteTable.Routes.MapPageRoute("route-name",
"some/path/{arg}",
"~/Pages/SomePage.aspx");
// Route for a WCF service
RouteTable.Routes.Add(new ServiceRoute("Services/SomeService",
new WebServiceHostFactory(),
typeof(SomeService)));
Run Code Online (Sandbox Code Playgroud)
尝试使用会RouteTable.Routes.MapPageRoute()产生错误(处理程序不会派生出错Page). System.Web.Routing.RouteBase似乎只有2个派生类:ServiceRoute用于服务,DynamicDataRoute用于MVC.我不确定是什么MapPageRoute()(Reflector没有显示方法体,它只显示"在NGen图像边界内嵌这种方法的性能至关重要").
我看到它RouteBase没有密封,并且有一个相对简单的界面:
public abstract RouteData GetRouteData(HttpContextBase httpContext);
public abstract VirtualPathData GetVirtualPath(RequestContext requestContext,
RouteValueDictionary values);
Run Code Online (Sandbox Code Playgroud)
所以也许我可以制作自己的HttpHandlerRoute.我会给出一个镜头,但如果有人知道现有的或内置的映射路由到IHttpHandlers的方式,这将是伟大的.
我正在使用IHttpHandler从数据库提供图像.相关代码在这里:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpeg";
int imageID;
if (int.TryParse(context.Request.QueryString["id"], out imageID))
{
var photo = new CoasterPhoto(imageID);
if (photo.CoasterPhotoID == 0)
context.Response.StatusCode = 404;
else
{
byte[] imageData = GetImageData(photo);
context.Response.OutputStream.Write(imageData, 0, imageData.Length);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5));
context.Response.Cache.SetLastModified(photo.SubmitDate);
}
}
else
context.Response.StatusCode = 404;
}
Run Code Online (Sandbox Code Playgroud)
问题是浏览器不会缓存图像,大概是因为我没有在响应头中指出正确的东西.我认为HttpCachePolicy属性上的部分调用方法会强制浏览器保留图像,但事实并非如此.我认为"正确"的事情是处理程序返回没有图像的304状态代码,对吧?如何使用IHttpHandler实现这一目标?
编辑:
根据最佳答案,我运行了此代码,它完全解决了问题.是的,它需要一些重构,但它通常会证明我追求的是什么.相关部分:
if (!String.IsNullOrEmpty(context.Request.Headers["If-Modified-Since"]))
{
CultureInfo provider = CultureInfo.InvariantCulture;
var lastMod = DateTime.ParseExact(context.Request.Headers["If-Modified-Since"], "r", provider).ToLocalTime();
if (lastMod == photo.SubmitDate)
{
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified";
return;
}
}
byte[] imageData …Run Code Online (Sandbox Code Playgroud) 在IIS 7上,我正在尝试将自定义HttpHandler用于我的ASP.NET Web应用程序.我使用管道模式"经典",.NET版本是4.0.30319,我的处理程序的web.config配置是:
<system.webServer>
<handlers>
<add name="MyHandler" path="*.myExtension" verb="*" type="Company.App.UI.Controls.MyHandler, Company.App.UI" resourceType="Unspecified" />
</handlers>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
当我调用此处理程序时,我收到此错误:
HTTP Error 500.21 - Internal Server Error
Handler "MyHandler" has a bad module "ManagedPipelineHandler" in its module list
Run Code Online (Sandbox Code Playgroud)
我做了谷歌搜索时,大多数人通过重新注册ASP.NET通过ASPNET_REGIIS.EXE/i命令解决这个问题,但这不是为我工作(在命令完成后,我重新启动IIS,但同样的错误).我在两台不同的服务器上尝试过,但结果相同.
我还应该尝试什么?谢谢
我写了一个httphandler来处理所有XSLT请求.
处理程序的名称是XSLTHandler.cs.
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpHandlers>
<add verb="*" path="*.xsl" type="XSLTHandler" />
</httpHandlers>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息,不知道如何解决它.
配置错误说明:处理为此请求提供服务所需的配置文件时发生错误.请查看下面的具体错误详细信息并相应地修改配置文件.
分析器错误消息:无法加载类型'XSLTHandler'.
asp.net ×10
ihttphandler ×10
httphandler ×4
c# ×3
.net ×1
asp.net-mvc ×1
handler ×1
iis ×1
iis-7 ×1
rest ×1
session ×1
system.web ×1
web-config ×1