解析器错误:无法在通用 Web 处理程序中创建类型“xyz ASP.NET

本文关键字:创建 程序 处理 类型 NET ASP xyz Web 错误 | 更新日期: 2023-09-27 18:35:53

我的 Web 应用程序项目中有一个 ASP.NET 通用 Web 处理程序 (*.ashx)。它在Web服务器上的路径是/Services/PayPal/IPNListener.ashx

IPNListener.ashx

<%@ WebHandler Language="C#"
               CodeBehind="IPNListener.ashx.cs"
               Class="Portal.Services.PayPal.IPNListener" %>

IPNListener.ashx.cs

//-----------------------------------------------------------------------------
// <copyright file="IPNListener.cs" company="DCOM Productions">
//     Copyright (c) DCOM Productions.  All rights reserved.
// </copyright>
//-----------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Web;
using Portal.PayPal;
namespace Portal.Services.PayPal
{
    /// <summary>
    /// Summary description for IPNListener
    /// </summary>
    public class IPNListener : IHttpHandler
    {
        /// <summary>
        /// Receives the HttpWebRequest via an HttpContext and processes the request
        /// </summary>
        public void ProcessRequest(HttpContext context) {
            // I gutted this, because it still produces the same error
            context.Response.Write("Hello World!");
        }
        /// <summary>
        /// Gets a System.Boolean value that indicates whether the generic handler may be reused
        /// </summary>
        public bool IsReusable {
            get {
                return false;
            }
        }
    }
}

当我尝试导航到处理程序时,我收到以下错误。

Parser Error
Description: An error occurred during the parsing of a resource required to service 
             this request. Please review the following specific parse error details 
             and modify your source file appropriately. 
Source Error
Line 1:  <%@ WebHandler Language="C#"
                        CodeBehind="IPNListener.ashx.cs"
                        Class="Portal.Services.PayPal.IPNListener" %>
Source File: /portal/services/paypal/ipnlistener.ashx    Line: 1

这是我到目前为止所做的:

(1)内脏处理者。我将其内脏为一个简单的Hello World处理程序,如我发布的代码所示,以消除代码中出错的可能性。处理程序以前工作得很好,我实际上不确定是什么原因导致它停止工作。

(2) 检查版本控制。就像我之前说的,处理程序大约一天前工作正常。我检查了文件历史记录的版本控制,以查看是否有任何更改,并且没有。

(3) 应用程序池。我在 IIS 7 中检查了应用程序池,它ASP.NET v4.0正常运行。

(4) 已验证的构建操作。我验证了IPNListener.ashx的构建操作设置为 Content ,并且IPNListener.ashx.cs的构建操作设置为 Compile

(5) 已验证 DLL 完整性。我使用 IL 反汇编程序验证了编译的 DLL 文件中确实存在类型 Portal.Services.PayPal.IPNListener

(6) 虚拟应用程序目录。文件夹/Services/PayPal不是虚拟应用程序,我从来没有让它成为通用处理程序工作的应用程序,但我还是尝试了它,仍然产生相同的错误。

(7)干净重建。我尝试清洁溶液,然后重建。没有编译器错误。然后继续发布Web应用程序,一切正常。

(8) 检查依赖关系。我检查以确保部署了所有必需的文件和依赖项。一切都检查出来。

我真的不知道为什么这停止工作。一切都经过测试,并准备在今天为我的第一个软件产品实时发布所有内容,当我在支付服务上进行最后一次测试运行时,它返回了一个 500 内部服务器错误,其中进一步调查表明它是由此问题引起的。

我真的被难住了。我在 StackOverflow 以及整个网络上搜索了有关 ASHX 处理程序和此问题的所有其他帖子,发现对我的特定问题没有任何用处。

这可能是我忽略的非常简单的事情,但我似乎无法将手指放在上面。

(更新) 2012/5/29 22:57。离开Ray Cheng的评论和我的评论,我意识到该服务曾经住在/PayPal/IPNListener.ashx,并被移至/Services/PayPal/IPNListner.ashx。移动完成后,ASHX 文件中的所有命名空间和类位置都将更新。

出于好奇,我将处理程序复制到/PayPal/IPNListener.ashx,更新了 ASHX 文件中的命名空间和类,并导航到该位置,服务工作正常。

本质上

/Services/PayPal/IPNListener.ashx

由于Could not create type产生 500 内部服务器错误,并且

/PayPal/IPNListener.ashx

工作得很好。那么,为什么让处理程序一个文件夹层次结构向上会对工作产生影响呢?

解析器错误:无法在通用 Web 处理程序中创建类型“xyz ASP.NET

问题很简单。我有两台 IIS 7 服务器,一台用于本地测试,另一台位于互联网上。

本地 IIS 服务器将父目录/Services设置为虚拟应用程序。我发现在泛型处理程序路径中的某个位置具有虚拟应用程序会导致 ASP 引擎无法创建处理程序类型。这就解释了为什么将服务从/PayPal/IPNHandler.ashx移动到/Services/PayPal/IPNHandler.ashx会中断,因为前一个路径不是虚拟应用程序,而后者会破坏处理程序。

删除 /Services 的虚拟应用程序解决了测试服务器上的问题,现在它按预期工作。

无论如何,该路径中不应该有虚拟应用程序,但这是一个疏忽,因为/Services不仅仅用于此处理程序。

事实证明,实时服务器上的问题是处理程序中使用的 WCF 服务的服务地址指向使用 localhost 别名的测试服务器,因此是无效地址。实时服务器在虚拟应用程序配置或其他方面没有任何问题,这是一个不正确的地址。

更新不正确的地址解决了 500 内部服务器错误。这与处理程序导致解析错误的原始问题无关,而是在能够让一切正常工作之前发现并解决的第二个问题。