- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在开发一个自定义的 HttpHandler(用于压缩/组合 CSS,但这对这个问题无关紧要)。
我从众所周知的简单 reusable=true 同步 HttpHandler 开始。
现在我正在尝试将其改进为异步处理程序(因为它使用 IO 功能并且在非常繁忙的网站上使用)。
我的第一次尝试(这似乎工作正常):
Action<HttpContext> asyncProcessRequest;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
asyncProcessRequest = new Action<HttpContext>(ProcessRequest);
return asyncProcessRequest.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
asyncProcessRequest.EndInvoke(result);
}
public virtual void ProcessRequest(HttpContext context)
{
// real work
}
这是一个不可重用的 httphandler(根据我的阅读,IsReusable 应该是 false,因为这个处理程序有状态(asyncProcessRequest 字段)。
现在我想让它可以重复使用。所以我的第一个想法是创建一个 IAsyncResult/Action 的字典,如下所示:
IDictionary<IAsyncResult, Action<HttpContext>> asyncProcessRequests;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
if (asyncProcessRequests == null)
{
asyncProcessRequests = new Dictionary<IAsyncResult, Action<HttpContext>>();
}
var request = new Action<HttpContext>(ProcessRequest);
var result = request.BeginInvoke(context, cb, extraData);
asyncProcessRequests.Add(result, request);
return result;
}
public void EndProcessRequest(IAsyncResult result)
{
Action<HttpContext> action;
if (asyncProcessRequests.TryGetValue(result, out action))
{
action.EndInvoke(result);
}
}
这是一个正确的模式吗?还是我跑题了?
它似乎有效(我没有收到任何错误或奇怪的行为),但在将其投入生产之前,我想与在编写这些 Http 处理程序方面比我更有经验的人进行验证..
提前致谢!
最佳答案
通常,对于异步模式,您应该使用传递给 BeginXxx 方法的状态参数作为最后一个参数(您将其称为 extraData
)。
因此您可能想要创建一个帮助程序类来保存(原始的)extraData
以及处理请求结束所需的任何其他状态。
但是,在您的特定情况下,我相信您不会通过使用异步模式来加速任何事情。虽然它有效,但它基本上只会增加开销,因为您正在以异步方式调用委托(delegate),它只会将调用分派(dispatch)到线程池以处理调用。因此,只要您没有通过异步调用同时运行多个委托(delegate),您就不会受益太多。由于 Web 请求已经是多线程的,我认为这对性能没有帮助;相反,您会遇到线程池饥饿的风险。
正确高效的异步处理并不容易。如果您正在执行固有的异步操作,例如从文件或网络连接读取数据,或者在调用支持异步调用的外部组件(例如 Web 服务调用或数据库)时,您可以从中受益。
关于c# - 可重用异步 HttpHandler 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208120/
我有一个在客户端页面上运行的 HttpHandler(跨域,而不是在我们的 IIS 服务器上等),当他们单击我们的嵌入式链接时,它会触发我们服务器上的处理程序。到目前为止一切正常。 我现在尝试使用 S
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章HttpHandler HttpModule入门篇由作者收集整理,如果你
我想编写一个 HttpHandler 将流量重定向到服务器上的各个网页。用户将输入 http://www.thisissupposetoberedirected.com/site12 并应重定向到适当
我构建了一个自定义的 HttpHandler,它会在负载均衡器请求特定资源时发出状态页面。 更多背景知识:它不能是 Controller ,因为我需要能够与其他程序集共享它,并且公司编码策略不允许来自
我正在为 URL 重写编写一个简单的 HttpHandler,但我碰壁了。 我创建了一个非常简单的 HttpHandler 类来测试: public class HttpHandler : IHttp
我有一个 HTTP 处理程序,它是我们应用程序 90% 的入口点。基本上它会收到一个请求,处理大量数据并返回一个非常具体的文件,具体取决于它嵌入的客户端和网页等。我已经设置了应用程序映射,以便所有 .
我有一个如下所示的 HttpHandler。 @Override public void handleRequest(HttpServerExchange exchange) throws E
我想在我的 MVC 应用程序中创建一个仅针对页面请求(而不是 css、脚本、图像等)调用的 HttpHandler。 如何只在 web.config 文件中定位没有扩展名的请求? 谢谢 最佳答案 如果
只有当用户登录到不同的页面时,我才尝试重定向用户。我正在使用 HTTPHandler 拦截此请求并重定向。用户登录后,控件不会返回此 HTTPHandler。任何想法或建议 namespace NES
我正在编写一个小的 Java 应用程序,它实现了一个从客户端接收 http post 命令的 http 服务。 我用来实现所有这些的类是 com.sun.net 中的 HttpHandler 和 Ht
我正在尝试将文件分块发送到 HttpHandler,但是当我在 HttpContext 中收到请求时,inputStream 为空。 所以 a:发送时我不确定我的 HttpWebRequest 是否有
我正在尝试创建一个 HTTP 处理程序来处理对一个文件夹的所有请求,但我只希望它在请求的文件不存在时触发(例如:请求来自文件 X,如果 X 存在我会喜欢提供文件,否则处理程序应该处理它)。 文件将只是
使用 HTTPHandler 与 .aspx 相比有哪些优势?它是否具有相同的功能,是否重量更轻、速度更快? 有哪些缺点? 最佳答案 Aspx 使用具有复杂页面生命周期和大量附加处理的全功能 Web
我已经定义了一个自定义的 HttpHandler, public class RequestHandler : IHttpHandler 我通过我所有的请求,
在 IIS6 中是否有使用 ISAPI 过滤器/扩展的理由?使用 httphandler/http 模块无法实现相同的功能。同样在 IIS7 中是否完全删除了 ISAPI?是用.Net编写的IIS7的
我需要编写一个 HttpHandler 来提供 JavaScript 文件,这些文件是我项目中 .DLL 中的嵌入资源。 View 中的引用不能直接看到这样的资源,因此我计划使用 HttpHandle
我对 system.web 中的 httpHandlers 感到困惑和 system.webServer 中的处理程序.这两种配置有什么区别?以及如何以及何时使用它们? 实际上另一个问题也是针对模块的
我创建了一个 HttpHandler,以下是 Web.config 中的设置 IsReusable = true in HttHandler 假设我的应用程序中有 20 个用户,他们正在尝试输入以下
在带有 IIS7 的 ASP.NET 4.0 中,我创建了一个 HttpHandler 并在 web.config 中注册了它 在这里,我试图实现的是处理对 http://my-server/MyP
在带有 IIS7 的 ASP.NET 4.0 中,我创建了一个 HttpHandler 并在 web.config 中注册了它 在这里,我试图实现的是处理对 http://my-server/MyP
我是一名优秀的程序员,十分优秀!