3

我的 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's build action 设置为Content,并且IPNListener.ashx.cs's build action 设置为Compile

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

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

(7)清洁重建。我试过清理解决方案,然后重建。没有编译器错误。然后继续发布Web应用程序,一切都很好。

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

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

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

这可能是我忽略的非常简单的事情,但我似乎无法理解它。

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

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

本质上

/Services/PayPal/IPNListener.ashx

由于Could not create type, 和

/PayPal/IPNListener.ashx

工作得很好。那么,为什么将处理程序设置为一个文件夹层次结构会影响工作呢?

4

1 回答 1

1

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

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

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

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

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

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

于 2012-05-30T12:02:18.363 回答