winform程序里面捕捉到一个HttpException异常,异常显示执行了HttpApplicationFactory的Init方法,Web程序里面,HttpApplicationFactory是由IIS在接收到请求后,通过一系列处理最后调用的,但是不知道为什么winform程序里面会执行到这个方法。winform程序的主要 组件有RabbitMQ、Quartz.NET、Castl ActiveRecord、WebSocket,是这些东西影响到的吗? 或者大家知道,HttpApplicationFactory.Init方法,还有什么方式来调用到?
下面是异常对象序列化信息:
"ClassName":"System.Web.HttpException", "Message":" Invalid file name for file monitoring: ''. Common reasons for failure include: - The filename is not a valid Win32 file name. - The filename is not an absolute path. - The filename contains wildcard characters. - The file specified is a directory. - Access denied.", "Data":null, "InnerException":null, "HelpURL":null, "StackTraceString":" at System.Web.FileChangesMonitor.StartMonitoringFile(String alias, FileChangeEventHandler callback) at System.Web.HttpApplicationFactory.SetupChangesMonitor() at System.Web.HttpApplicationFactory.Init() at System.Web.HttpApplicationFactory.EnsureInited() at System.Web.HttpApplicationFactory.RaiseError(Exception error) at System.Web.Caching.CacheEntry.CallCacheItemRemovedCallback(CacheItemRemovedCallback callback, CacheItemRemovedReason reason) at System.Web.Caching.CacheEntry.Close(CacheItemRemovedReason reason) at System.Web.Caching.CacheSingle.UpdateCache(CacheKey cacheKey, CacheEntry newEntry, Boolean replace, CacheItemRemovedReason removedReason, Object& valueOld) at System.Web.Caching.ExpiresBucket.FlushExpiredItems(DateTime utcNow, Boolean useInsertBlock) at System.Web.Caching.CacheExpires.FlushExpiredItems(Boolean checkDelta, Boolean useInsertBlock) at System.Web.Caching.CacheExpires.TimerCallback(Object state) at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.TimerQueueTimer.CallCallback() at System.Threading.TimerQueueTimer.Fire() at System.Threading.TimerQueue.FireQueuedTimerCompletion(Object state) at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch() at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()", "RemoteStackTraceString":null, "RemoteStackIndex":0, "ExceptionMethod":" 8 StartMonitoringFile System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a System.Web.FileChangesMonitor System.DateTime StartMonitoringFile(System.String, System.Web.FileChangeEventHandler)", "HResult":-2147024809, "Source":"System.Web"
经过长时间的监控发现,这种异常出现在数据库服务压力大的时候。因此判定这个异常与数据库连接有关,但是具体原因还是不得知。
恩,如果这个错误不是从网络上下载来的(比如 WCF等可以传递服务器异常)
那么,可以先排查一下引用中有没有调用System.web.runtime 的东西或者组件。。
找一个源代码查看工具,把编译玩的程序拉进去,会自动分析依赖的类库。
我在本程序代码里面查找了用到System.Web命名空间的代码,分析过后,我觉得那些是不会调用到HttpApplicationFactory的。你说的反编译工具指的哪个呢? ILSpy还是Reflector,我只用过他们进行反编译, 还没用过他们进行定位依赖组件的解析。 能截图说明一下怎么用吗? 谢谢了。
@hourglasser: http://www.telerik.com/download/justdecompile 我用的是这个工具, 左边那里右键,然后选择 Find Using 就可以找到所有使用这个类或成员的 对象
@G yc {Son of VB.NET}: 好的, 非常感谢!
WebSocket、RabbitMQ都会用到Http请求,错误可能要具体再跟踪一下。
用到HTTP请求,但是这个会执行HttpApplicationFactory.Init的? 貌似不会吧, 而且WebSocket在System.Net命名空间下,而且接受和发送数据都是使用的Socket进行的,这个应该是不会执行HttpApplicationFactory.Init。 关于RabbitMQ,没有那么清楚了,这个会执行HttpApplicationFactory.Init的?不太清楚,如果我理解有什么错误的地方,还请指出一下。
@hourglasser: 具体不知道哪个会使用到,我觉得还是从错误出处找原因,跟一下出错的时候的调用栈。
@幻天芒: 我上面给出的错误序列化信息就有跟踪堆栈信息了,跟踪信息显示执行了HttpApplicationFactory.Init,就是不知道什么组件或者说代码会调用到HttpApplicationFactory,如果知道这个了,错误应该就比较方便定位了。 谢谢你的回答。
@hourglasser: 上一步的调用者,应该是能够看到的哦。,