1

我正在尝试让不同的服务器端堆栈与我的 ASP.NET 站点一起运行。我的 ashx 文件似乎引发了 500 内部服务器错误。我如何弄清楚这个 ashx 文件抛出了什么异常或抛出 500 的原因?当我附加到我的 IIS 7 w3wp.exe 进程时,它不会引发异常,但我读到这很可能是这种情况。

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
4

2 回答 2

3

如果您有一个名为“App_Code”的文件夹,您可能会感到头疼和偏头痛。或者简单地将“App_Code”替换为“code”或“data”之类的随机名称,然后将您的类放在那里来解决这个问题。就我而言,我的项目 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 文件更改为 Properties > Build Action > Compile
  • 修复他们抛出的异常以使构建再次工作 - 清洁解决方案 > 构建解决方案 ...一个异常没有被设置为属性 > 构建操作 > 无捕获,所以这就是为什么这是必要的。本质上,Visual Studio 2012 不会抛出异常并显示“构建成功”。
  • 然后将 App_Data *.cs 文件更改回 Properties > Build Action > None
  • 从 \obj\Debug 中删除 dll
  • 从 \bin 中删除 dll
  • 删除临时 ASP.NET 文件 -C:\WINDOWS\Microsoft.NET\Framework\{.NET version}\Temporary ASP.NET Files\
  • 构建解决方案
  • 重新启动 IIS 网站

现在一切都很好!

编辑:

实际问题是我在 Visual Studio 中引用了一个外部项目,但没有 dll 文件,因为项目类型是控制台应用程序,而不是类库。真正的问题是,Visual Studio 说它编译代码很好(在 App_Code 中),当您对其他项目有一个 using 语句时,但说已成功构建,即使为所有 *.cs 文件设置了 Build Action > Compile 选项应用程序代码。当您运行 Web 应用程序时,必须将其设置回 Build Action > None 才能正常工作。但是,由于 App_Code 中的 *.cs 文件实际上并未使用新代码进行编译(如果 IIS 中的 ASP.NET 是这样处理这些 App_Code *.cs 文件的),它会抛出 500 Internal Server 错误,因为没有好的 CIL 代码在运行时。为了解决它,我只是将项目类型更改为类库,

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

于 2014-10-01T07:40:33.630 回答
1

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

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
}
于 2014-10-01T06:24:03.653 回答