14

JavaScript ファイルを「埋め込みリソース」としてマークしました
WebResource 属性を AssemblyInfo クラスに追加しました

今、埋め込まれた JavaScript をマスター ページに出力しようとしています。私が得ているのは、Web リソースの URL から「Web リソースが見つかりません」というメッセージだけです。


プロジェクト アセンブリ名:

CompanyProduct


プロジェクトの既定の名前空間:

Company.Product.Web


Javascript ファイルの場所:
Library/navigation.js


アセンブリ情報:

[assembly: WebResource("CompanyProduct.Library.navigation.js", "text/javascript")]


マスター ページのコード:

Page.ClientScript.RegisterClientScriptInclude("NavigationScript", Page.ClientScript.GetWebResourceUrl(this.GetType(), "CompanyProduct.Library.navigation.js"));

「/」アプリケーションでサーバー エラーが発生しました。

リソースが見つかりません。

説明: HTTP 404。探しているリソース (またはその依存関係の 1 つ) は、削除されたか、名前が変更されたか、一時的に利用できない可能性があります。次の URL を見直して、スペルが正しいことを確認してください。

要求された URL: /WebResource.axd
バージョン情報:  Microsoft .NET Framework バージョン:2.0.50727.1433; ASP.NET バージョン:2.0.50727.1433

4

15 に答える 15

14

の代わりにthis.GetType()、リソースを含むアセンブリから型を取得します。つまり:

typeof(Company.Product.Web.Library.Class1)

それは動作しますか?

于 2009-02-08T16:45:51.543 に答える
4

今日同じ問題に来ました。問題は、AssemblyResourceLoader がメソッド (最初のパラメーター) に提供された型を含むアセンブリを使用しているようです。このGetWebResourceUrl場合、マスター ページ (.master) 用に動的に作成されたアセンブリであり、探しているリソースが含まれていません。リソース ファイルがベース マスター ページ (.master.cs ファイル) と同じアセンブリに含まれていると仮定すると、それを使用typeofして Type インスタンスを取得できます。

Page.ClientScript.RegisterClientScriptInclude(
   "NavigationScript",
   Page.ClientScript.GetWebResourceUrl(
      typeof(MyMasterPage),
      "CompanyProduct.Library.navigation.js"));

ここで、MyMasterPage はマスター ページの名前です

リソースが埋め込まれている同じアセンブリで宣言された他の型を使用することもできるようです。

于 2010-08-09T13:06:38.383 に答える
3

フルパスは、アセンブリではなく名前空間に基づいている必要があると思います。したがって、「CompanyProduct.Library.navigation.js」がある場合は、それを「Company.Product.Web.Library.navigation.js」に置き換えます。また、(RegisterClientScriptInclude(GetWebResourceUrl()を使用するのではなく)1つのメソッドで必要なことを実行するメソッドPage.ClientScript.RegisterClientScriptResource()があります。

于 2008-11-26T13:36:37.580 に答える
1

これはちょっとしたことですが、webresource.axd を正しく処理するように asp.net が設定されていない可能性がありますか? 何か問題が発生した場合、ハンドラー タグがマシンの web.config にない可能性がありますか?

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config の http ハンドラー タグには、次のような webresource.axd エントリが必要です。

<httpHandlers>
    <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True"/>
</httpHandlers>

また、プロジェクトの web.config に、マシンの web.config の設定を上書きする可能性のあるハンドラー エントリがないことを再確認してください。

于 2009-02-26T23:24:21.690 に答える
1

this blog is two years old now... but I I spent days on trying to get this to work. Trying to get an embedded js file to actually give me a WebResource.asx query string that would work. The final piece that seems to get glossed over here is that the file you have embedded HAS to be in the same physical directory structure as the controls code-behind that you are calling GetWebResourceUrl() from. If you've placed the embedded file in a folder called "scripts", then called GetWebResourceUrl() from the master page which is NOT found in "scripts", the ResourceURL returned will point to the wrong location... thus ALWAYS returning a 404.

if you are using the MasterPage as the type for the first param then it will never work. GetWebResourceUrl(typeof(MasterPage),... I guess the real key here is that you have to drop the embedded resource into the same location that you are going to use as the type for the first parameter of the ResourceURL. After 3 days of wrestling with this thing, it finally found my Resource.

于 2010-12-14T20:29:40.493 に答える
1

たまたま VB を使用している場合は、VB コンパイラと C# コンパイラの動作に違いがあります。

VB では、埋め込みリソースはプロジェクトのルート レベルにある必要があります。生成されたアセンブリを ILDASM で調べたところ、埋め込まれたリソースの名前にサブフォルダーの名前が含まれていないことがわかりました。これにより、最終的に、AssemblyLoader が埋め込みリソースの間違った場所を検索するようになります。

C# で実験を繰り返すと、サブフォルダーの名前が含まれます。

編集 - VB の場合、リソースがルート レベルにある必要があることを反映するように変更されました。

私が成功したのは、それを使用するコードと同じフォルダーに埋め込みリソースを配置することでした (ソース管理に適しています)。次に、埋め込まれたリソースにパスがないと主張する VB コンパイラを説明するために、属性と Page.ClientScript.GetWebResourceUrl 呼び出しに嘘をつきました。

于 2012-02-21T21:43:31.883 に答える
1

この問題が発生し、meandmycode の応答に基づいて解決しました。ただし、より詳細な説明が必要な場合があります。

メソッドを使用してスクリプト ブロックを登録する場合ScriptManager.RegisterClientScriptInclude、「type」パラメーターは、.js スクリプトと同じプロジェクト内のクラスである必要があります。スクリプト ブロックに関連付けられたクラスがない場合は、別のクラスを選択する必要があります。

于 2013-01-31T23:22:41.810 に答える
0

[アセンブリ:]属性はProperties\AssemblyInfo.csファイルにある必要があります。アセンブリ属性がカスタム制御ファイルにあるときにプロジェクトがコンパイルされても、それらはWebResource.axdには表示されません。

于 2013-02-08T09:00:47.943 に答える
0

スクリプトタグの生成に使用しているコードに、別のアセンブリで追加しているリソースはありますか?その場合、this.GetType()は間違ったアセンブリの型への参照を返すため、Webリソースコードにはリソースをロードするための適切なアセンブリがありません。

これが問題になるかどうかはわかりませんが、名前を生成したコードは、リソースがどのアセンブリにあるかを知る必要があるようです。そうしないと、そのアセンブリにマップして戻すことができません。ブラウザからリクエストを受け取りました。

于 2009-02-27T07:24:49.743 に答える
0

meandmycode が既に述べたように、渡される型がGetWebResourceUrlキーです

あまり意味のないところで型を渡すのが好きではなかったので、この種のヘルパーメソッドで解決しました

static public string GetEmbeddedResourceLink(Page page, string assemblyName, string resource) {
    var assembly = Assembly.Load(assemblyName);
    var types = assembly.GetTypes();
    if (types.Length == 0) {
        throw new ArgumentException("assembly does not contain any type");
    }
    return page.ClientScript.GetWebResourceUrl(types[0], resource);
}
于 2011-10-27T11:58:25.423 に答える
0

私は同様の状況にあり、約 4 時間の調査とテストの後、最終的な解決策を得ました: Default Namespace は Assembly Name と同じでなければなりません
(Reflector を使用するか、以下のコード スニペットを使用して、埋め込まれたリソースの名前を取得できます。

string[] embeddedResNames = Assembly.LoadFile("YourDll.dll").GetManifestResourceNames()
于 2011-04-21T14:19:44.843 に答える
0

あなたの質問に対する答えは、実際のプロジェクトのどこにこのファイルがあるか、およびデフォルトの名前空間が何であるかによって完全に異なります。Chris が述べたように、スクリプトを登録するメソッドに提供するパスには、埋め込まれたリソースを見つけるための正しいパスが必要です。AssemblyInfo で指定した文字列と一致するだけではありません。文字列は、リソースへの正しいパスである必要があります。

< デフォルトのプロジェクト名前空間 >/< ファイルがあるサブフォルダー >/< ファイル名 >

于 2008-11-26T23:13:43.360 に答える
0

これを回してください。

Page.ClientScript.RegisterClientScriptInclude("NavigationScript"...

これに;

Page.ClientScript.RegisterClientScriptInclude("CompanyProduct.Library.navigation.js"...
于 2008-11-27T00:37:21.613 に答える