3

Web アプリケーション プロジェクトに ASP.NET Generic Web Handler (*.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)バージョン管理を確認しました。前に言ったように、ハンドラーは 1 日かそこら前まで問題なく動作していました。ファイルの履歴のバージョン管理をチェックして、何かが変更されたかどうかを確認しましたが、変更されていません。

(3)アプリケーションプール。IIS 7 でアプリケーション プールを確認したところ、正常に実行ASP.NET v4.0されています。

(4)検証済みのビルド アクションIPNListener.ashxのビルド アクションが に設定されていることContent、およびそのIPNListener.ashx.csビルドアクションが に設定されていることを確認しましたCompile

(5) DLL の完全性を検証。IL 逆アセンブラーを使用Portal.Services.PayPal.IPNListenerして、コンパイルされた DLL ファイルに型が存在することを確認しました。

(6)仮想アプリケーション ディレクトリ。フォルダー/Services/PayPalは仮想アプリケーションではなく、汎用ハンドラーが機能するようにする必要はありませんでしたが、とにかく試してみましたが、同じエラーが引き続き生成されます。

(7)クリーン リビルド。ソリューションをクリーニングしてから再構築してみました。コンパイル エラーはありません。次に、Web アプリケーションの公開に進みます。すべて問題ありません。

(8)依存関係を確認しました。必要なすべてのファイルと依存関係がデプロイされていることを確認しました。すべてがチェックアウトします。

なぜこれが機能しなくなったのか、私にはまったくわかりません。私の最初のソフトウェア製品のすべてがテストされ、今日すべてをライブで公開する準備が整いました。支払いサービスで最後のテストを実行したとき、500 内部サーバー エラーが返されました。さらに調査したところ、原因がこの問題。

私は実際には本当に困惑しています。ASHX ハンドラーに関する他のすべての投稿と、StackOverflow でのこの問題、および Web 全体を検索しましたが、ここでの特定の問題に役立つものは何も見つかりませんでした。

私が見落としているのは本当に単純なことかもしれませんが、指を置くことができないようです。

(更新) 2012 年5 月 29 日午後 10 時 57 分Ray Chengさんのコメントと私のコメントから離れて、サービスが に住んでいて/PayPal/IPNListener.ashx、 に移動したことに気付きました/Services/PayPal/IPNListner.ashx。移動が完了すると、すべての名前空間とクラスの場所が ASHX ファイルで更新されました。

好奇心から、ハンドラーを にコピーし/PayPal/IPNListener.ashx、ASHX ファイルの名前空間とクラスを更新し、その場所に移動したところ、サービスは正常に動作しました。

本質的に

/Services/PayPal/IPNListener.ashx

が原因で 500 内部サーバー エラーが発生しCould not create type

/PayPal/IPNListener.ashx

うまく動作します。では、なぜハンドラーを 1 フォルダー階層上に置くと、作業に違いが生じるのでしょうか?

4

1 に答える 1

1

問題は単純なものでした。2 台の IIS 7 サーバーがあり、1 台はローカル テスト用で、もう 1 台はインターネット上にあります。

ローカル IIS サーバーには/Services、仮想アプリケーションとして設定された親ディレクトリがありました。ジェネリック ハンドラーへのパスのどこかに仮想アプリケーションがあると、ASP エンジンがハンドラー タイプの作成に失敗することがわかりました。これは、前者のパスが仮想アプリケーションではなく、後者のパスがハンドラーを壊していたため、サービスを/PayPal/IPNHandler.ashxから壊れた理由を説明しています。/Services/PayPal/IPNHandler.ashx

仮想アプリケーションを削除する/Servicesと、テスト サーバーの問題が解決され、期待どおりに動作するようになりました。

いずれにせよ、そのパスに仮想アプリケーションがあるはずではありませんでしたが、/Servicesこのハンドラー以外にも使用されているため、見落としでした。

localhostライブ サーバーの問題は、ハンドラーで使用される WCF サービスへのサービス アドレスがエイリアスを使用してテスト サーバーを指していたため、無効なアドレスであることが判明しました。ライブ サーバーには、仮想アプリケーションの構成などの問題はなく、アドレスが正しくありませんでした。

間違ったアドレスを更新すると、500 Internal Server エラーが解決されました。これは、解析エラーの原因となったハンドラーの元の問題とは関係ありませんが、すべてが機能する前に見つかった 2 番目の問題であり、解決されました。

于 2012-05-30T12:02:18.363 に答える