Подтвердить что ты не робот

Ошибка ASP.NET: ошибка WebResource.axd 404: как узнать, какая сборка/ресурс отсутствует или ответственна?

Я получаю 404 сообщение об ошибке HTTP (не найден) в конкретном вызове WebResource.axd внутри веб-приложения ASP.NET 3.5 (AJAX). Я думаю, ошибка возникает потому, что в папке bin/GAC отсутствует конкретная ссылочная сборка. Но я не знаю, что, поскольку страница, которая запрашивает ресурс, очень сложна (я использую сторонние элементы управления и ASP.NET Ajax.)

Можно ли узнать из зашифрованного параметра "d" querystring запроса, например:

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

какая сборка должна создать контент и, возможно, отсутствует?

Примечание. Существуют другие вызовы WebRequest.axd, которые выполняются с успехом.

4b9b3361

Ответ 1

Одна из причин этой проблемы заключается в том, что зарегистрированный путь к вложенным ресурсам неверен или ресурса нет. Убедитесь, что файл ресурсов добавлен как Embedded Resource.

Asp.net использует WebResourceAttribute, который должен указывать путь к ресурсу.

Файл ресурсов должен быть добавлен в качестве встроенного ресурса в проект, и путь к нему будет полным пространством имен и именем файла.

Итак, у вас есть следующий ресурс проекта "my.js" в проекте "MyAssembly", путь ресурса будет "MyAssembly.my.js".

Чтобы проверить, какой файл обработчик веб-ресурсов не находит, вы можете расшифровать хеш-код, указанный на URL-адресе WebResource.axd. Ниже приведен пример, как это сделать.

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 для ASP.NET AJAX Team Link: http://blogs.telerik.com/aspnet-ajax/posts/07-03-27/debugging-asp-net-2-0-web-resources-decrypting-the-url-and-getting-the-resource-name.aspx

Это должно вернуть URL-путь, по которому aspt.net считает, что встроенный ресурс находится.

Ответ 2

Я просто потратил часы на аналогичную проблему. Из-за большой статьи, отмеченной Diadistis, я смог расшифровать URL-адрес WebResource и узнать, что мой WebResource был переведен на неправильный указатель сборки, узнаваемый мусором перед вашим именем ресурса. После многих попыток выяснилось, что это связано с тем, что я использовал файл page.ClientScript.GetWebResourceUrl в классе, полученном из другого класса, который находился за пределами сборки, в которой находился мой ресурс. Сбивчивая вещь заключалась в том, что мой класс был в той же сборке, хотя класс, полученный из НЕ. Параметр this.GetType() много статей state является обязательным, оказалось, что это не так уж важно в моей ситуации. Фактически, его нужно было заменить на typeof(), и он сработает! Надеюсь, это может помешать другим получить такую ​​же головную боль, как я получил от этого педераста.

Ответ 3

В моем случае источником ошибки 404 было то, что дата и время машины, на которой работает IIS, были неправильными (из прошлого).

Ответ 4

Есть ли в вашем проекте какие-либо ссылки?

Есть ли ссылки на CopyLocal = False (общие с Infragistics или GAC'ed refs), которые не попадают в пункт назначения?

Утилита, подобная рефлектору или зависимому ходоку, скажет вам, нет ли в вашей основной сборке каких-либо зависимостей, которые не сразу очевидны.

Есть ли в обработчике Application_Error в global.asax есть catch, который создает любую информацию об ошибке (FileNotFoundExceptions)?

Вы установили пользовательские ошибки на "только удаленный" и просмотрели сайт с локальной машины?