解析器错误:无法在通用 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
工作得很好。那么,为什么让处理程序一个文件夹层次结构向上会对工作产生影响呢?
问题很简单。我有两台 IIS 7 服务器,一台用于本地测试,另一台位于互联网上。
本地 IIS 服务器将父目录/Services
设置为虚拟应用程序。我发现在泛型处理程序路径中的某个位置具有虚拟应用程序会导致 ASP 引擎无法创建处理程序类型。这就解释了为什么将服务从/PayPal/IPNHandler.ashx
移动到/Services/PayPal/IPNHandler.ashx
会中断,因为前一个路径不是虚拟应用程序,而后者会破坏处理程序。
删除 /Services
的虚拟应用程序解决了测试服务器上的问题,现在它按预期工作。
无论如何,该路径中不应该有虚拟应用程序,但这是一个疏忽,因为/Services
不仅仅用于此处理程序。
事实证明,实时服务器上的问题是处理程序中使用的 WCF 服务的服务地址指向使用 localhost
别名的测试服务器,因此是无效地址。实时服务器在虚拟应用程序配置或其他方面没有任何问题,这是一个不正确的地址。
更新不正确的地址解决了 500 内部服务器错误。这与处理程序导致解析错误的原始问题无关,而是在能够让一切正常工作之前发现并解决的第二个问题。