从Generic Handler(ashx)文件中捕获ASP.NET中的exception

我试图让我的ASP.NET站点使用不同的服务器端堆栈。 我的ashx文件似乎抛出了500内部服务器错误。 我如何弄清楚这个ashx文件抛出的exception或抛出500的原因? 当我附加到我的IIS 7 w3wp.exe进程时,它不会抛出exception,但我读到这可能是这种情况。

ashx文件位于我的ASP.NET站点的根目录中,并且属性将其设置为编译。

GET http://uhc-8:8883/MyApp/ExtDirectProxy.ashx 500 (Internal Server Error) index.html:27 Uncaught TypeError: Cannot read property 'isProvider' of null ext-all-debug.js:74832 allow right click initializing for http://uhc-8:8883/MyApp/index.html rightclick.js:1 allow right click processing http://uhc-8:8883/MyApp/index.html rightclick.js:25 

如果你有一个名为“App_Code”的文件夹,你可以经历头痛和迁移。 或者简单地用“代码”或“数据”之类的随机名称替换“App_Code”,并将您的类放在那里以解决此问题。 就我而言,我的项目GUID是Web应用程序和C#类型。

最佳答案:

App_Code文件夹问题

注意:

我使用带有静态端口的IIS运行该站点,而不是使用带动态端口的Visual Studio 2012。 我在Web服务器上有特定的服务器配置,因此我希望该站点的行为与我们发布的站点的工作方式相同。 这就是为什么我这样运行它。

回答我的问题:

发生这种情况是因为我们在bin文件夹中有App_Data类的重复版本。 * .cs的“编译”版本和* .cs的网站版本。 当存在多个具有相同名称的类时,会发生“isProvider”错误。 当我们部署ASP.NET应用程序时,我们只部署* .cs文件的编译版本。 在开发环境中,我们将它们设置为Properties> Build Action> None。

不确定一个简单的方法。 它可能与在临时和/或obj文件夹中有东西有关,但不确定。 将采取更多的故障排除来发现原因。 与此同时,这里列出了解决问题的方法。 不确定是否有必要采取部分或全部措施,但现在正在运作。

修复步骤:

  • 将所有App_Data * .cs文件更改为“属性”>“构建操作”>“编译”
  • 修复它们为使构建再次运行而抛出的exception – 清理解决方案>构建解决方案… 未设置为属性>构建操作>无的一个exception,这就是为什么这是必要的。 从本质上讲,Visual Studio 2012不会抛出exception并说“构建成功”。
  • 然后将App_Data * .cs文件更改回“属性”>“构建操作”>“无”
  • 从\ obj \ Debug中删除dll
  • 删除\ bin中的dll
  • 删除临时ASP.NET文件 – C:\WINDOWS\Microsoft.NET\Framework\{.NET version}\Temporary ASP.NET Files\
  • 构建解决方案
  • 重新启动IIS网站

现在事情很棒!

编辑:

实际问题是我在Visual Studio中引用了一个外部项目,但没有dll文件,因为项目类型是Console Application,而不是Class Library。 真正的问题是,当你有一个using语句到另一个项目时,Visual Studio说它编译代码很好(在App_Code中),但是说成功构建,即使为所有* .cs文件设置了Build Action> Compile选项App_Code文件。 运行Web应用程序时,必须将其设置回“构建操作”>“无”才能使其正常工作。 但是,由于App_Code中的* .cs文件实际上没有使用新代码进行编译(如果这是IIS中的ASP.NET处理这些App_Code * .cs文件的方式),它会抛出500内部服务器错误,因为没有好的CIL代码在运行时。 为了解决这个问题,我只是将项目类型更改为类库,它仍然没有错误,但现在它可以将dll引用到另一个项目。

找到重复的类时,始终会发生isProvider错误。 所以我不确定为什么会发生这种情况,但是一旦修复上述部分,这基本上就消失了。

您可以使用Global.asax文件中的Application_Error事件来捕获该错误。

 protected void Application_Error(Object sender, EventArgs e) { HttpContext ctx = HttpContext.Current; Exception exception = ctx.Server.GetLastError(); int httpCode = ((HttpException)exception).GetHttpCode(); // check if it is 500 }