web-dev-qa-db-ja.com

ASP.NET:WebResource.axd呼び出し404エラー:どのアセンブリ/リソースが欠落しているか、責任があるかを知る方法は?

ASP.NET 3.5(AJAX)Webアプリケーション内で特定のWebResource.axd呼び出しで404 HTTPステータスエラー(見つかりません)が発生します。特定の参照されたアセンブリがbinフォルダー/ GACにないため、エラーがスローされると思います。しかし、リソースを要求するページが非常に複雑であるため、どちらかはわかりません(サードパーティのコントロールとASP.NET Ajaxを使用しています)。

次のように、クエリの暗号化された「d」クエリ文字列パラメータから知ることは可能ですか?

.../WebResource.axd?d=...

どのアセンブリがコンテンツを作成する必要があり、欠落している可能性がありますか?

注:成功して実行される他のWebRequest.axd呼び出しがあります。

24
splattne

この問題の理由の1つは、登録されている埋め込みリソースパスが正しくないか、リソースが存在しないことです。リソースファイルが 埋め込みリソース として追加されていることを確認してください。

Asp.netは WebResourceAttribute を使用します。これには、リソースへのパスを指定する必要があります。

リソースファイルは埋め込みリソースとしてプロジェクトに追加する必要があり、そのパスは完全な名前空間とファイル名になります。

したがって、プロジェクト「MyAssembly」に次のプロジェクトリソース「my.js」があり、リソースパスは「MyAssembly.my.js」になります。

Webリソースハンドラーが検出していないファイルを確認するには、WebResource.axdURLで提供されているハッシュコードを復号化します。その方法については、以下の例を参照してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            byte[] encryptedData = HttpServerUtility.UrlTokenDecode("encoded hash value");

            Type machineKeySection = typeof(System.Web.Configuration.MachineKeySection);
            Type[] paramTypes = new Type[] { typeof(bool), typeof(byte[]), typeof(byte[]), typeof(int), typeof(int) };
            MethodInfo encryptOrDecryptData = machineKeySection.GetMethod("EncryptOrDecryptData", BindingFlags.Static | BindingFlags.NonPublic, null, paramTypes, null);

            try
            {
                byte[] decryptedData = (byte[])encryptOrDecryptData.Invoke(null, new object[] { false, encryptedData, null, 0, encryptedData.Length });
                string decrypted = System.Text.Encoding.UTF8.GetString(decryptedData);

                decryptedLabel.Text = decrypted;
            }
            catch (TargetInvocationException)
            {
                decryptedLabel.Text = "Error decrypting data. Are you running your page on the same server and inside the same application as the web resource URL that was generated?";
            } 
        }
    }
}

Telerik UI forASP.NETによる元のコード例AJAXチームリンク: http://blogs.telerik.com/aspnet-ajax/投稿/07-03-27/debugging-asp-net-2-0-web-resources-decrypting-the-url-and-getting-the-resource-name.aspx

これにより、aspt.netが埋め込みリソースがあると信じているURLパスが返されます。

31
Diadistis

私はちょうど同じような問題に何時間も費やしました。 Diadistisが指摘したすばらしい記事により、WebResourceのURLを復号化して、WebResourceが間違ったAssemblyポインターに変換され、リソース名の前のゴミで認識できることがわかりました。多くの苦労の末、これは、リソースが含まれているアセンブリの外部にある別のクラスから派生したクラスでPage.ClientScript.GetWebResourceUrlを使用していたためであることがわかりました。混乱したのは、クラスが同じアセンブリにあったことです。由来するクラスはそうではありませんでした。多くの記事で述べられているthis.GetType()パラメータは必須ですが、私の状況ではそれほど必須ではないことがわかりました。実際には、typeof()に置き換える必要があり、機能しました。これが、私がこのバガーから得たのと同じ頭痛を他の人が受けるのを防ぐかもしれないことを願っています。

11
Koen Zomers

私の場合、404エラーの原因は、実行中のマシンの日付と時刻 IISが(過去から)間違っていたことです。

10
gogowitsch

プロジェクトに参照がありませんか?

CopyLocal = False(InfragisticsまたはGACの参照で一般的)に設定されている、宛先に到達しない参照はありますか?

リフレクターや依存関係ウォーカーなどのユーティリティは、メインアセンブリに、すぐにはわからない依存関係がないかどうかを通知します。

Global.asaxの Application_Error ハンドラーには、エラー情報(FileNotFoundExceptions)を生成するキャッチがありますか?

カスタムエラー を「リモートのみ」に設定し、ローカルマシンからサイトを参照しましたか?

2
StingyJack