问题标签 [ihttpasynchandler]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1204 浏览

c# - 通过 IHttpAsyncHandler 读取 BLOB

我将图像存储在 SQL Server 2000 数据库(BLOB 类型)中。我的 ASP.NET 应用程序中有一个网页需要向最终用户显示很多图像,我想通过 IHttpAsyncHandler 处理浏览器对图像的请求。我在 codeproject “异步 BLOB DataReader 的异步 HTTP 处理程序”上找到了一个类似的帖子。 但是由于某些原因,页面在“BeginProcessRequest”方法完成后冻结,“EndProcessRequest”方法永远不会被调用。任何人都可以看看这个帖子,让我知道那个帖子有什么问题吗?或者我需要做什么来完成这个任务(通过 IHttpAsyncHandler 读取 BLOB)?

这篇文章中的源代码如下,

0 投票
1 回答
562 浏览

c# - IHttpAsyncHandler 和 IObservable 网络请求

在异步处理程序中,我从 webrequest 创建一个 IObservable,它返回一个重定向字符串。

我订阅了那个 observable 并调用了 AsyncResult.CompleteCall() 但我不得不使用 Thread.Sleep(100) 来执行它。而且不是每次都有效。我很确定这是不正确的。你能不能给点光。谢谢!

0 投票
1 回答
856 浏览

asp.net - 为什么通过 IHttpHandler 调用 IHttpAsyncHandler?

我制作了一个从 MvcHandler 派生的自定义处理程序。我的路由使用自定义 RouteHandler,它返回 GetHttpHandler() 的新处理程序,并在自定义处理程序中覆盖 ProcessRequest()。对 GetHttpHandler 的调用正在触发断点,并且肯定会调用我的处理程序的构造函数,但是在基础 MvcHandler 上调用 BeginProcessRequest() 而不是 ProcessRequest()。

当我没有做任何事情来调用它们时,为什么会调用异步方法?我不想要异步处理,而且我当然没有做任何明确的事情来获得它。我的控制器都派生自 Controller,而不是 AsyncController。

我现在没有源代码,但如果需要,我可以稍后添加。我希望有人可能知道在不需要时可能会调用 BeginProcessRequest 的一些原因。

0 投票
4 回答
2620 浏览

.net - 为什么 IHttpAsyncHandler 在负载下会泄漏内存?

我注意到 .NET IHttpAsyncHandler(和 IHttpHandler,在较小程度上)在受到并发 Web 请求时会泄漏内存。

在我的测试中,Visual Studio Web 服务器 (Cassini) 的内存从 6MB 跃升至 100MB 以上,并且一旦测试完成,就没有一个内存被回收。

问题很容易重现。使用两个项目创建一个新的解决方案 (LeakyHandler):

  1. 一个 ASP.NET Web 应用程序 (LeakyHandler.WebApp)
  2. 控制台应用程序 (LeakyHandler.ConsoleApp)

在 LeakyHandler.WebApp 中:

  1. 创建一个实现 IHttpAsyncHandler 的名为 TestHandler 的类。
  2. 在请求处理中,做一个简短的 Sleep 并结束响应。
  3. 将 HTTP 处理程序作为 test.ashx 添加到 Web.config。

在 LeakyHandler.ConsoleApp 中:

  1. 生成大量 HttpWebRequest 到 test.ashx 并异步执行。

随着 HttpWebRequests (sampleSize) 数量的增加,内存泄漏变得越来越明显。

LeakyHandler.WebApp > TestHandler.cs

LeakyHandler.WebApp > Web.config

LeakyHandler.ConsoleApp > Program.cs

调试更新

我使用 WinDbg 查看转储文件,一些可疑类型被保存在内存中并且从未释放。每次我以 10,000 的样本大小运行测试时,我最终都会在内存中保存 10,000 多个这样的对象。

  • System.Runtime.Remoting.ServerIdentity
  • System.Runtime.Remoting.ObjRef
  • Microsoft.VisualStudio.WebHost.Connection
  • System.Runtime.Remoting.Messaging.StackBuilderSink
  • System.Runtime.Remoting.ChannelInfo
  • System.Runtime.Remoting.Messaging.ServerObjectTerminatorSink

这些对象位于第 2 代堆中并且不会被收集,即使在强制完全垃圾收集之后也是如此。

重要的提示

即使在强制顺序请求时存在问题,即使没有Thread.Sleep(10)in ProcessRequest,它也更加微妙。该示例通过使问题更加明显而加剧了问题,但基本原理是相同的。

0 投票
2 回答
536 浏览

c# - 通过重建 AsynchResult 对象来模拟推送技术——这甚至可能吗?

最近,我使用 HttpAsyncHandler 成功创建了一个长轮询服务。在开发过程中,我想到(我)“可能”能够多次重用 AsyncResult 对象,而无需反复进行长轮询。如果可能的话,我可以通过以某种方式重新构建或重新使用 AsyncResult 来“模拟”推送技术(将第一个请求视为订阅请求)。

当然,第一次调用效果很好,但随后的调用不断给我“对象未设置为对象的实例”。我“猜测”是因为某些对象是静态的,因此,一旦“完成”就无法重用或检索(任何洞察力都会很棒!)。

所以问题是……</p>

是否可以从旧回调动态构建新回调?

最初的“订阅”过程如下:

以下是该服务的功能示例:

以下是 AsyncResult.ProcessRequest() 调用的示例:

那么……这样的事情可能吗?
我真的试过这个,但它没有用......但是“喜欢”的东西可能吗?

0 投票
2 回答
2204 浏览

asp.net-mvc - 使用 ASP.NET MVC 2 上传文件的最佳方式是什么?

上传可变大小文件(对于 ASP.NET MVC 2 应用程序文件系统非常大或非常小)的最佳方法是什么?

这是我目前所理解的:

人们似乎有两种处理方式。(假设文件可能非常大或非常小)

Request.Files(1) 通过或处理控制器动作中的上传HttpPostedFileBase,这似乎有一个缺点,因为 ASP.NET 将文件加载到活动内存中。

或者

(2) 使用 HttpModule 尽早拦截文件上传,以某种方式规避性能问题。(我对它的工作原理有点模糊,但我一直在使用这篇文章http://darrenjohnstone.net/2008/07/15/aspnet-file-upload-module-version-2-beta-1/作为参考)。 我不清楚的部分是 ASP.NET 在什么时候将提交的文件加载到活动内存中,以及在模块中拦截它实际上是如何改变这种行为的。

由于第二个选项更快,它似乎是更好的选择。但似乎提交上传表单的应用程序可能会有一些与需要保存在数据库中的文件相关联的数据。我不想在我的 HttpHandler 或 HttpModule 中进行持久性调用(因为那样我将在不同的地方发生两个非常相似的功能:控制器和 http 处理程序)。

我想一种解决方法是将目标文件位置存储在 HttpContext.Items 中,但这是最好的方法吗?

最后一个问题是我想在文件上传完成之前呈现一个 HttpResponse 。所以,如果有一个大文件,我会向用户发送一个带有上传状态值的视图,并进行 AJAX 调用以保持状态更新。 如何在保持上传过程继续进行的同时呈现结果?我需要制作 AsyncHandler 或 AsyncController 吗?我需要手动抓取另一个线程吗?

非常感谢你们。我知道这是很多问题,并且可能反映了对某事普遍缺乏了解。关于普遍缺乏理解的有趣之处在于,拥有他们的人也往往缺乏对他们缺乏什么理解的理解......所以,如果有人能在那个笔记上指出我正确的方向,我将不胜感激.

0 投票
0 回答
1143 浏览

asp.net - 异步 Http 处理程序

我有一个 ASHX 可以在 SQLite 上进行批量插入。此页面加载 2 秒 +/-

在我做 I/O 工作时,使用 Async Http Handler 来实现它是一个很好的做法,它不会持有 ASP.NET 线程。

要将我的 IHttpHandler 变成 IHttpAsyncHandler 我只是这样做了,对吗?

- 将我在 ASHX 实现的接口更改为 IHttpAsyncHandler

- 添加这个变量和构造函数:

- 实现了 2 个 IHttpAsyncHandler 方法:

我的主要疑问是我是否应该保留原始的 ProcessRequest 并像我一样用 Action 调用它。如果可以在 ProcessRequest 中使用 context.Response,或者这项工作应该在 EndProcessRequest 中完成

0 投票
1 回答
1450 浏览

asp.net - 在 asp.net 中处理 .csv 文件的异步 http 处理程序

我开发了一个基于长轮询方法的实时评分应用程序,或者他们也称之为 Comet。我使用了在 IIS 6 上运行的 ASP.NET 4.0(Windows 2003 - 只有两个 CPU,这对池中线程的可用性没有多大帮助)。

数据以.csv粘贴到 Web 服务器上的源文件夹的文件形式出现,然后我使用 Microsoft JET 4.0 OleDb Provider 将其导入,并根据应用程序的部分使用不同的方法显示。

长轮询部分的引擎依赖于,IHttpAsyncHandler.因为它是一个实时评分应用程序,所以用户访问网站,获得带有当前数据的定期响应,并且在正文加载时通过 jquery ajax 向异步 http 处理程序发送新请求。

然后,该处理程序将请求存储在队列中,并(通常)将线程返回到线程池。一旦发生这种情况,我将创建一个手动重置事件并保持操作,同时创建并发送一个文件系统观察程序对象以查找 csv 数据源文件夹中的更改。

一旦它触发了一个onChange事件,我就设置了手动重置事件,并且允许异步操作恢复并获取新的、刷新的 csv 文件并用新数据响应客户端。

如果我没有一直出错,这一切都会很好。一般来说,非常非常一般的方式,应用程序正在运行,但我有一个我不能完全指出的问题。

也就是说,我不确定问题是否与访问 csv 文件有关,因为它们可能被将它们带入服务器的过程锁定(从体育场馆进行 ftp 传输)。或者可能是我(ab)使用IHttpAsyncHandler了知道小时数)。

具有两个 CPU 的 IIS 6 windows 2003 是否可能无法支持此类应用程序?

这是我不断收到的错误:

事件类型:错误事件源:ASP.NET 4.0.30319.0 事件类别:无事件 ID:1325 日期:2011 年 4 月 20 日时间:15:33:14 用户:N/A 计算机:xxx 描述:发生未处理的异常并且该过程已终止。

应用程序 ID:/LM/W3SVC/1/ROOT 进程 ID:5264 异常:System.Data.OleDb.OleDbException 消息:未指定的错误

StackTrace:在 System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString 常量,OleDbConnection 连接)
在 System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions 选项,对象 poolGroupProviderInfo,DbConnectionPool 池,DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.OleDb.OleDbConnection.Open() 在 Broker.brCSV.readCSV(String fileName) 在 SwatchTiming.AsynchOperation.StartAsyncTask( System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 处的对象 workItemState) System.Threading。System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 处 System.Threading 处的 ExecutionContext.runTryCode(Object userData)。 ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback ()CleanupCode backoutCode, Object userData) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 在 System.Threading。 QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()CleanupCode backoutCode, Object userData) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 在 System.Threading。 QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()Boolean ignoreSyncCtx) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()Boolean ignoreSyncCtx) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

并且:

事件类型:错误事件源:.NET 运行时 4.0 错误报告事件类别:无事件 ID:5000 日期:20/04/2011 时间:15:33:14 用户:N/A计算机:xxx 描述:EventType clr20r3,P1 w3wp。 exe,P2 6.0.3790.3959,P3 45d6968e,P4 system.data,P5 4.0.0.0,P6 4ba1e064,P7 1ea3,P8 87,P9 system.data.oledb.oledbexception,P10 NIL。有关详细信息,请参阅http://go.microsoft.com/fwlink/events.asp.Data:0000上的帮助和支持中心 :63 00 6c 00 72 00 32 00
clr2.0008:30 00 72 00 33 00 2c 00 0.r.3.,.0010: 20 00 77 00 33 00 77 00 .w.3.w.0018: 70 00 2e 00 65 00 78 00
p...ex0020: 65 00 2c 00 20 00 36 00 e.,. .6.0028: 2e 00 30 00 2e 00 33 00 ..0...3.0030: 37 00 39 00 30 00 2e 00 7.9.0...0038: 33 00 39 00 35 00 39 00 3.9.5.9.0040: 2c 00 20 00 34 00 35 00 ,. .4.5.0048: 64 00 36 00 39 00 36 00 d.6.9.6.0050: 38 00 65 00 2c 00 20 00 8.e.,. .0058: 73 00 79 00 73 00 74 00 syst0060: 65 00 6d 00 2e 00 64 00 em..d.0068: 61 00 74 00 61 00 2c 00 ata,.0070: 20 00 34 00 2e 00 3。 4...0.0078:2e 00 30 00 2e 00 30 00
..0...0.0080: 2c 00 20 00 34 00 62 00 ,. .4.b.0088: 61 00 31 00 65 00 30 00 a.1.e.0.0090: 36 00 34 00 2c 00 20 00 6.4.,. .0098: 31 00 65 00 61 00 33 00 1.ea3.00a0: 2c 00 20 00 38 00 37 00,. .8.7.00a8: 2c 00 20 00 73 00 79 00 ,. .sy00b0: 73 00 74 00 65 00 6d 00 stem00b8: 2e 00 64 00 61 00 74 00 ..dat00c0: 61 00 2e 00 6f 00 6c 00 a...ol00c8: 65 00 64 00 62 00 2e 0 00d0: 6f 00 6c 00 65 00 64 00 oled00d8: 62 00 65 00 78 00 63 00 bexc00e0: 65 00 70 00 74 00 69 00 epti00e8: 6f 00 6e 00 20 40 0 4e 0.0 0.0.0 0d 00 0a 00 IL....

和...

事件类型:错误事件源:.NET 运行时事件类别:无事件 ID:1026 日期:2011 年 4 月 20 日时间:15:34:26 用户:不适用计算机:xxx 描述:应用程序:w3wp.exe 框架版本: v4.0.30319 描述:进程因未处理的异常而终止。异常信息:System.Data.OleDb.OleDbException

堆栈:在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(System.Data.Common.DbConnection, System.Data.ProviderBase.DbConnectionFactory) 在 System.Data.OleDb.OleDbConnection.Open() 在 Broker.brCSV.readCSV(System. String) 在 [ProjectNamespace].AsynchOperation.StartAsyncTask(System.Object) 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) 在 System.Threading.ExecutionContext.runTryCode(System.Object) 在 System.Runtime.CompilerServices.RuntimeHelpers。 ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) 在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object, Boolean) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

最后再补充几条信息。我曾尝试微调 IIS 6,但似乎没有太大帮助。

那么有没有人知道到底发生了什么,为什么我的网站每五分钟就崩溃一次?

编辑:这是我在处理程序中的代码,希望这会有所帮助

BeginProcessRequest如下(除了我只设置为IsReusablefalse):

然后是AsynchOperation实现的类IAsyncResult

编辑#2: Broker.brCSV.readCSV(fileName) 的代码

请注意连接字符串的结尾,特别是Mode参数。msdn 声明这是您指定文件访问权限的方式,但可能是我没有以正确的方式解释说明......也就是说,mode=3应该将文件访问指定为读/写,但我不是确定它是否有效。

编辑#3:新的 Broker.brCSV.readCSV() 抛出 InvalidOperationException

根据好心助手 Smudge202 的建议,我更改了 Broker.brCSV.readCSV 方法的代码,如下所示:

但是,当测试此代码时,会导致以下错误:

事件类型:错误事件源:ASP.NET 4.0.30319.0 事件类别:无事件 ID:1325 日期:22/04/2011 时间:08:46:33 用户:N/A 计算机:EUW0002184 描述:发生未处理的异常并且该过程已终止。

应用程序 ID:/LM/W3SVC/1/ROOT

进程 ID:6408

异常:System.InvalidOperationException

消息:阅读器关闭时调用 Read 的尝试无效。

StackTrace:在 System.Data.OleDb.OleDbDataReader.Read() 在 SwatchTiming.AsynchOperation.StartAsyncTask(Object workItemState) 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 在 System.Threading.ExecutionContext.runTryCode(Object userData) 在 System .Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback , 对象状态, Boolean ignoreSyncCtx) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue。System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 处的 Dispatch()

也:

事件类型:错误事件源:.NET 运行时事件类别:无事件 ID:1026 日期:22/04/2011 时间:08:47:53 用户:N/A 计算机:EUW0002184 描述:应用程序:w3wp.exe 框架版本: v4.0.30319 描述:进程因未处理的异常而终止。异常信息:System.InvalidOperationException 堆栈:在 System.Data.OleDb.OleDbDataReader.Read() 在 SwatchTiming.AsynchOperation.StartAsyncTask(System.Object) 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object) 在 System.Threading.ExecutionContext .runTryCode(System.Object) 在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) 在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading。

因此,当处理程序尝试使用新的 readCSV 方法时,我会收到这些错误...还有什么建议吗?:) 谢谢涂抹,也谢谢其他人!

0 投票
1 回答
957 浏览

c# - 如何设置 IHttpAsyncHandler?

我正在尝试设置一个异步 HttpHandler,但我不知道我是否走在正确的轨道上。似乎没有太多关于它的文档。我只想获得异步触发 DoWork() 方法的请求。

一些我不确定的事情:

0 投票
1 回答
246 浏览

asp.net - 运行时使用的 IHttpAsyncHandler 实例

给定一个 IHttpAsyncHandler 实例 A,A 会是接收 EndProcessRequest 回调的实例吗?如果有,有保障吗?IsReusable 属性是否会改变行为?

尝试测试我想伸出手来看看其他人是否已经走上了这条路,这已经足够复杂了。

我目前有一个 IHttpAsyncHandler 使用一个状态对象,该对象被发送到 EndProcessRequest 并且一切正常。但是,如果我可以在实例级别变量(如属性或字段)中保留状态,我可以大幅清理代码。

想法?