Ад WebResource - ресурс не может быть найден - PullRequest
14 голосов
/ 26 ноября 2008

Помечен файл javascript как "Встроенный ресурс"
Добавлен атрибут WebResource в мой класс AssemblyInfo

Теперь я пытаюсь вывести встроенный JavaScript на мою главную страницу. Все, что я получаю, это «веб-ресурс не найден» с URL-адреса веб-ресурса.


Название сборки проекта:

CompanyProduct


Пространство имен проекта по умолчанию:

Company.Product.Web


Файл Javascript расположен:
Библиотека / navigation.js


AssemblyInfo:

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


Код на главной странице:

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

Ошибка сервера в приложении '/'.

Ресурс не найден.

Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, изменилось его имя или временно недоступен. Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.

Запрошенный URL: / WebResource.axd
Информация о версии: Microsoft .NET Framework Версия: 2.0.50727.1433; ASP.NET версия: 2.0.50727.1433

Ответы [ 14 ]

14 голосов
/ 08 февраля 2009

Вместо this.GetType() получите тип из сборки, содержащей ресурс .. т.е.:

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

Это работает?

4 голосов
/ 09 августа 2010

Сегодня пришли к той же проблеме. Кажется, проблема в том, что AssemblyResourceLoader использует сборку, содержащую тип, предоставленный методу GetWebResourceUrl (первый параметр), который в вашем случае является динамически создаваемой сборкой для главной страницы (.master) и не содержит искомого ресурса. , Я предполагаю, что ваш файл ресурсов включен в ту же сборку, что и базовая главная страница (файл .master.cs), тогда вы можете использовать typeof для получения экземпляра типа

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

где MyMasterPage - это имя вашей главной страницы

Похоже, также можно использовать любой другой тип, объявленный в той же сборке, где встроен ресурс.

3 голосов
/ 26 ноября 2008

Я думаю, вы хотите, чтобы полные пути основывались на пространстве имен, а не на сборке; Поэтому, где бы у вас не было «CompanyProduct.Library.navigation.js», замените его на «Company.Product.Web.Library.navigation.js». Кроме того, есть метод Page.ClientScript.RegisterClientScriptResource (), который делает все, что вам нужно, в одном методе (в отличие от использования RegisterClientScriptInclude (GetWebResourceUrl ()).

1 голос
/ 22 октября 2013

У меня была похожая проблема, и в моем случае это было вызвано тем, что параметр Page.ClientScript.GetWebResourceUrl resourceName является чувствительным к регистру .

1 голос
/ 01 февраля 2013

Просто имел эту проблему и решил ее, основываясь на ответе meandmycode; однако, возможно, требуется более подробное объяснение.

Когда вы регистрируете блок скрипта с помощью метода ScriptManager.RegisterClientScriptInclude, параметр «type» должен иметь класс внутри того же проекта, что и скрипт .js. Если у вас нет класса, связанного с блоком скрипта, вам просто нужно выбрать другой класс.

1 голос
/ 22 февраля 2012

Для тех, кто использует VB - есть разница в поведении между компилятором VB и компилятором C #.

В VB встроенный ресурс ДОЛЖЕН находиться на корневом уровне вашего проекта. Когда я посмотрел на сгенерированную сборку с ILDASM, я обнаружил, что имя встроенного ресурса НИКОГДА не включает в себя имена любых подпапок. В конечном итоге это приводит к тому, что AssemblyLoader ищет неправильный ресурс для встроенного ресурса.

Когда вы повторяете эксперимент с C #, он включает имена подпапок.

РЕДАКТИРОВАТЬ - Изменено, чтобы отразить, что для VB ресурс должен быть на корневом уровне.

То, что мне удалось, это иметь встроенный ресурс в той же папке, что и код, который его использует (лучше для контроля исходного кода). Затем я ЛИЛ в атрибуте И вызове Page.ClientScript.GetWebResourceUrl для учета компилятора VB, утверждая, что встроенный ресурс не имеет путей.

1 голос
/ 14 декабря 2010

этому блогу уже два года ... но я потратил несколько дней, пытаясь заставить это работать. Попытка получить встроенный js-файл, который на самом деле дает мне строку запроса WebResource.asx, которая будет работать. Последняя часть, которая, как мне кажется, здесь приукрашена, - это то, что файл, который вы внедрили, ДОЛЖЕН быть в той же физической структуре каталогов, что и управляющий код, из которого вы вызываете GetWebResourceUrl(). Если вы поместили внедренный файл в папку с именем «scripts», а затем с главной страницы, которая не найдена в «scripts», с именем GetWebResourceUrl(), возвращаемый ResourceURL будет указывать на неправильное местоположение ... таким образом ВСЕГДА возвращает 404.

если вы используете MasterPage в качестве типа для первого параметра, то он никогда не будет работать. GetWebResourceUrl(typeof(MasterPage), ... Я предполагаю, что реальный ключ здесь в том, что вы должны поместить встроенный ресурс в то же место, которое вы собираетесь использовать в качестве типа для первого параметра ResourceURL. После 3 дней борьбы с этой штукой она наконец нашла мой ресурс.

1 голос
/ 27 февраля 2009

Это немного цепляется за соломинку, но может ли быть так, что ваш asp.net не настроен для правильной обработки webresource.axd? Если что-то пошло не так, может быть, отсутствует тег обработчика в web.config машины?

Тег обработчика http для C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ web.config должен иметь запись webresource.axd, например:

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

Также дважды проверьте, что в файле web.config проекта нет записи обработчика, которая могла бы переопределить настройку из web.config машины.

0 голосов
/ 08 февраля 2013

Атрибуты [assembly:] должны находиться в файле Properties \ AssemblyInfo.cs. Несмотря на то, что проект компилируется, когда атрибуты сборки находятся в файле пользовательского элемента управления, они не отображаются в WebResource.axd.

0 голосов
/ 27 октября 2011

Как уже упоминалось в 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);
}
...