【问题标题】:IIS Error 500.2 -1 How do I deploy a simple custom Handler in IIS Windows 10?IIS 错误 500.2 -1 如何在 IIS Windows 10 中部署简单的自定义处理程序?
【发布时间】:2024-05-02 00:15:02
【问题描述】:

我正在尝试在 Windows 10、IIS 10 上自学一个 IIS 处理程序。当然,我从一个教程开始

MS Tutorial

它已经很旧了,但我找不到比这更全面的东西了,而且信息集中在一个地方。

简单的类和函数是这样的:

using System;
using System.Web;
namespace IISHandler {
class MyHandler : IHttpHandler {
    public bool IsReusable
    {
        get { return true; }
    }
    public void ProcessRequest(HttpContext context) {
        DateTime dt;
        String useUTC = context.Request.QueryString["utc"];
        if (!String.IsNullOrEmpty(useUTC) &&
            useUTC.Equals("true")) {
            dt = DateTime.UtcNow;
        } else {
            dt = DateTime.Now;
        }
        context.Response.Write(
            String.Format("<h1>{0}</h1>", dt.ToLongTimeString()));

    }
 }
}

我在 VS 2015 中创建了程序集,一切看起来都很好。直到我试图“部署”它。然后一切都崩溃了。

我已经挖了三天了。没有任何信息在一个地方。我将介绍我所做的。 首先,将 DLL 复制到 Web 应用程序的 /bin 文件夹中。没关系。

然后使用 IIS 管理器中的“添加模块”选项。好吧,在默认级别它给了我这个:

好的,我不会将此添加到大会。我想要的只是我的 Web 应用程序中的自定义处理程序。

接下来,仔细观察,我只将它添加到一个 Web 应用程序中。

教程说添加模块会发现它。好吧,那没有发生。我有一个似乎是“内置”的列表,但不是我从教程中创建的 DLL。

所以我手动输入了名称“IISHandler.MyHandler”,即命名空间(程序集)和类名。然后 IIS 管理器告诉我:

没有多少网络搜索给我任何线索如何处理它。

接下来,我决定深入研究 web.config 文件。当然,MS 页面会告诉您,您可以获得所有详细信息……在未来的某个时间。

(这是 2008 年发布的。但我对 MS doc 的期望如此之低,没有什么让我感到惊讶)

我确实设法在 web.config 上找到了一些其他资源。因此,在尝试获得 IIS XML 配置文件的硕士学位时,我已将注意力集中在以下文件内容上:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
           <add name="MyTest" path="example.time" verb="*" resourceType="Unspecified"  
             modules="IISHandler.MyHandler" preCondition="integratedMode"  />
       </handlers>
     </system.webServer>
</configuration>

这里要做的就是拦截一个页面请求“example.time”,按照教程中的C#原代码返回当前时间。

响应一直是这样的:

它不是告诉我它无法找到该模块,只是它很糟糕。但是对于微软,真正的问题是什么并不清楚。

我尝试(不成功)设置 module="IISHandler",尽管这没有意义,因为仍然需要知道要调用的类。我是对的,它仍然没有工作。

继续搜索,整个网络都有执行此命令的建议(这没有意义,因为“功能”已经通过控制面板添加了):

%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

这给了我一个错误:

(告诉我在我的 IIS 8 上安装 .NET 4.5 只是 MS 的另一个缺陷)

我的 IIS 10 的添加/删除功能不显示 4.5 但它确实显示 4.8

这很重要吗?我不知道,也找不到任何文档。

我还确保 AppPool 设置为“集成”,并且此 Web 应用程序位于该池中

但我的选择只有 .NET 2.0 或 .NET 4.0...但添加/删除功能为我提供了 3.5,而不是 2.0?我的程序集是在 .NET 4.8 中构建的(我也在 4 中重试......不走运)。而且 IIS 10 下的 Add/Remove 中没有 4.0 作为选项。

2.0、3.5、4.0、4.5、4.8 的组合是什么??

但我的问题的真正核心是: 让 IIS 识别我的 C# 程序集并简单地处理一个简单的自定义处理程序的过程是什么?

我希望这是足够的信息,有人可以提供一些帮助。

TIA

-太空人斯科特

【问题讨论】:

  • @jdweng 这和这个问题有什么关系?
  • @jdweng 请在发布之前停下来考虑一下。清楚地解释相关性。
  • 角色必须正确才能连接到服务器
  • @jdweng 但这与这个问题有什么关系?

标签: c# asp.net .net iis


【解决方案1】:

具有讽刺意味的是,一位同事(远程)工作人员正试图解决同样的问题。他告诉我,他在我发布这篇文章几个小时后就开始工作了。

这是 web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules>
          <add name="MyModule" type="IISHandler.MyModule" />
        </modules>  
        <handlers>
            <add name="MyHandler" path="example.time" verb="*" resourceType="Unspecified" type="IISHandler.MyHandler" />
        </handlers>
    </system.webServer>
</configuration>

虽然我还没有IIS XML配置文件的硕士或博士学位,但具体的区别是添加了中添加了“type”属性来表示具体的handler功能。

“模块”属性也从 中删除,尽管this page 似乎表明服务器知道在哪里可以找到提供处理程序的模块。显然不是。

用于处理处理序列期间的所有请求,并且由于不需要该功能,因此没有手动输入。但显然仍然有必要告诉配置您将使用该组装模块。

如果有人遇到类似的问题,也许这会有所帮助。

【讨论】:

    最近更新 更多