WebResource.axd не найден, WebResource.axd 404

Встречали подобное? Если да – то вам крайне повезло, т.к. не зная как решить подобную проблему – можно просидеть довольно долго (наблюдал подобное).

Итак, 404 - WebResource.axd not found может возникать по нескольким причинам:

1. IIS считает, что ресурс должен существовать
Это может быть в случае, если для сайта вручную задан обработчик запросов для ASP.NET ресурсов (чем является и WebResource.axd) и установлен флаг на проверку наличия файлов.
Для снятия флага необходимо:

  • открыть окно свойств сайта
  • перейти во вкладку “Домашний каталог” и нажать “Настройка”
  • откроется окно “Настройка приложения”, где необходимо выбрать расширение сопоставления aspnet_isapi.dll  и нажать на “Изменить”
  • в открывшемся окне снять флаг “Проверка наличия файла”
  • Untitled

    2. IIS не знает что есть такой тип
    Возможно расширение настроено нормально, но WebResource.axd по прежнему не найден, поэтому можно предположить, что добавление MIME Type может помочь

  • перейти в список MIME типов
  • нажать добавить
  • ввести расширение axd
  • ввести MIME Type application/octet-stream
  • image

    3. Вручную прописать в web.config обработчик файлов *.axd

    <system.web>
    <httpHandlers
    >
         <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="true"/>
    </
    httpHandlers
    >
    </
    system.web>
    4. Файл реально существует
    В этом случае – просто удалите файл
    5. В файле web.config запрещен доступ к этому файлу
    Удалите примерно такой код из файла конфигурации:

      <
    location path="WebResource.axd"
    >
        <
    system.web
    >
          <
    authorization
    >
            <
    deny users="*"
    />
          </
    authorization
    >
        </
    system.web
    >
      </
    location>
    В любом случае – возможны и иные причины, но описанные выше решения помогут в большинстве случаев

    Вызов методов WebService из Javascript

    Давненько читал, что можно вызывать методы вебсервиса, практически напрямую, т.е. не используя сторонние библиотеки для создания ajax запросов к вебсервису.

    Естественно я имею ввиду MS Web Services

    При обращении в веб сервису с добавлением параметра /js или /jsdebug – получаем javascript, содержащий все функции вебсервиса, реализующие обратный ajax вызов

    Для теста создал простой вебсервис, и чтобы он мог возвращать javascript отметил его атрибутом [ScriptService] 

    После этого добавил на страницу скрипт вебсервиса
    <script src="Helper.asmx/jsdebug" type="text/javascript"></script>

    Загруженный скрипт зарегистрирует в сценариях новое пространство имен под названием сборки текущего проекта

    В зарегистрированное пространство имен будет добавлена функция/объект одноименная названию класса веб сервиса, и у этого объекта есть все функции веб сервиса.

    Загруженный скрипт выглядит примерно так:

    Type.registerNamespace('SimpleCMS');

    SimpleCMS.Helper=
    function
    () {

    ...

    SimpleCMS.Helper.prototype={

    ...

    GetWhoInCart:
    function(entityIds,pageModuleIds,succeededCallback, failedCallback, userContext) {
    ...
    И как уже стало видно – у нас появилась возможность вызвать функцию сервиса из яваскрипта:
    SimpleCMS.Helper.GetWhoInCart(entityIds, pageModuleIds, function (list) { /*обработать результат*/ }
    Кстати – добавить вебсервис на страницу можно через ScriptManager:
    ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("~/Helper.asmx"));
    В разметке:
    <asp:ScriptManager runat="server">
    <Services>
          <asp:ServiceReference Path="~/Helper.asmx" />
       </Services>
    </asp:ScriptManager>
    Чем удобен данный подход? Простотой использования – достаточно вебсервис добавить на страницу, и будет нам доступ ко всем его функциям, и не нужно использовать jQuery или иные javascript фреймворки для реализации ajax-запросов



     
     

    IHttpModule для установления локализации

    Дали сайт, с кучей страниц, где каждая страница унаследована от System.Web.UI.Page, а необходимо реализовать многоязычность. Таким образом – овверайдить для каждой страницы определение локали – невозможно, а ходить по всем страницам и менять базовый класс – как-то не хотелось.
    Потому решил создать HttpModule, т.к. они вызываются для каждого запроса.

    1. создаем класс, инмплементируем интерфейсом IHttpModule, не забывая удалить эксепшн в методе Dispose()

    2. функция public void Init(HttpApplication context)вызывается при старте Application и через HttpApplication можем навесить обработчик на начало запроса от пользователя:
    context.BeginRequest += (o, e) => { наш код }

    context.BeginRequest += (o, e) =>
    {
    if (context.Context.Request["ui"] != null
    )
    LanguageUtility.SetCurrentCulture(context.Context.Request["ui"
    ]);
     
    else // выглядит не ахти, но это правильно
    LanguageUtility.SetCurrentCulture(LanguageUtility
    .CurrentCulture);
    };

    3. устанавливаем локаль:


    А в LanguageUtility уже запоминаем локаль, в моем случае – в кукисы
    Имейте ввиду – устанавливать локаль необходимо постоянно


    4. Установка культуры потока:

    Thread.CurrentThread.CurrentCulture =
                   
    CultureInfo
    .CreateSpecificCulture(culture);

    Thread.CurrentThread.CurrentUICulture =
    new CultureInfo(culture);

    5. Чтобы модуль заработал – необходимо его зарегистрировать в файле web.config:


    <system.web>
      <httpModules>
        <add name="CultureModule" type="HttpModules.CultureModule" />
      </
    httpModules>
    </system.web>


    6. собственно – установите бряки и отлаживайте


    Имейте ввиду, что подобное можно было сделать и без создания HttpModule, а всего лишь использовать событие Application_BeginRequest класса Global : System.Web.HttpApplication


    Но с другой стороны – если придется реализовывать не одну логику проверки на реквесте, а допустим несколько, и возможно – переносить логику на другое приложение, то HttpModule довольно-таки удобная вещь

    Could not load file or assembly ‘Name’ or one of its dependencies…

    Could not load file or assembly ‘Name’ or one of its dependencies. An attempt was made to load a program with an incorrect format.
    Встречали подобную ошибку?
    Если нет – считайте повезло, но вы не работаете с x64 режимом IIS
    Если Ваше web-приложение не запускается под IIS выдавая подобную ошибку – необходимо в настройках пула приложения указать 32-х битный режим работы
    Я встретился с этой ошибкой в IIS 7, потому скрины будут оттуда
    1. выбрать проблемный пул
    image
    2. кликнуть правой кнопкой мыши, в раскрывшемся пункте меню выбрать “Set Application Pool Defaults…”
    image
    3. установить значение параметра “Enable 32-Bit Applications” в True
    4. нажать Ok и все будет в порядке, если конечно, 32-х битная библиотека действительно присутствует в сборке Улыбка
    Удачи!