4

在过去的 2 天里,我试图让我的自定义 HTTP 处理程序工作,但没有结果。我收到以下错误:

无法加载类型“AlarmHandler”。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Web.HttpException:无法加载类型“AlarmHandler”。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

我遵循了几个教程,但我想我错过了一些小东西。我正在使用以下配置:

  • IIS 7.5
  • DefaultPool 设置为集成模式
  • 所有文件都在根目录 (C:\inetpub\wwwroot)
  • IIS7.5 中没有定义处理程序映射
  • 网络项目

AlarmHandler.ashx.cs

using System.Web;
public class AlarmHandler : IHttpHandler
{
    // Constructor.
    public AlarmHandler() { }


    public void ProcessRequest(HttpContext context)
    {
        HttpRequest Request = context.Request;
        HttpResponse Response = context.Response;

        // Test code.
        Response.Write("<html>");
        Response.Write("<body>");
        Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");
        Response.Write("</body>");
        Response.Write("</html>");
    }


    public bool IsReusable
    {
        get { return false; }
    }
}

警报.ashx

<% @ WebHandler language="C#" class="AlarmHandler" codebehind="AlarmHandler.ashx.cs" %>

网络配置

<configuration>
    <system.webServer>
        <handlers>
            <add name="AlarmHandler" path="*.ashx" verb="*" type="IHttpHandler" />
        </handlers>
    </system.webServer>
</configuration>
4

2 回答 2

3

对我有用的是改变:

<% @ WebHandler language="C#" class="AlarmHandler" codebehind="AlarmHandler.ashx.cs" %>

到:

<% @ WebHandler language="C#" class="Namespace.AlarmHandler" codebehind="AlarmHandler.ashx.cs" %>

Namespace声明的命名空间在哪里AlarmHandler

考虑到这一点,我认为将处理程序注册更改为此可能是一个好主意:

<add name="AlarmHandler" path="*.ashx" verb="*" type="Namespace.AlarmHandler" />

顺便说一句,我在很多场合都使用过 HTTP 处理程序,并且从未费心注册它们(在我的例子中,我倾向于通过 Ajax 显式调用它们),所以这行甚至可能不是必需的。

编辑:

在这种情况下,您没有使用 Visual Studio,这使事情有些不同,因为您没有 bin 目录,因此我们必须对处理程序进行一些不同的处理。

目前,您的处理程序分为 ASHX 和 CS 文件。这通常没问题,但在您的情况下,我们需要将它们结合起来。

这应该是您Alarms.ashx文件的内容(您不再需要该AlarmHandler.ashx.cs文件):

<% @ WebHandler language="C#" class="AlarmHandler" %>

using System.Web;

public class AlarmHandler : IHttpHandler
{
    // Constructor.
    public AlarmHandler() { }

    public void ProcessRequest(HttpContext context)
    {
        HttpRequest Request = context.Request;
        HttpResponse Response = context.Response;

        // Test code.
        Response.Write("<html>");
        Response.Write("<body>");
        Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");
        Response.Write("</body>");
        Response.Write("</html>");
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

顺便说一句,您所遵循的教程几乎肯定会假设您使用的是 Visual Studio,这可能解释了您遇到的一些困难。

于 2012-11-12T09:14:37.350 回答
2

仅仅因为这出现在关于 httphandlers 和 codebehind 文件的 Google 搜索中:您需要做的就是将 .cs 文件放到 App_Code 文件夹中,然后从 .ashx 文件中引用该类。

于 2014-10-31T19:40:34.607 回答