ASP.NET: ошибка 404 вызова WebResource.axd: как узнать, какая сборка / ресурс отсутствует или ответственна?
Я получаю сообщение об ошибке состояния 404 (не найдено) для определенного вызова WebResource.axd внутри веб-приложения ASP.NET 3.5 (AJAX). Я предполагаю, что ошибка генерируется, потому что в папке bin /GAC отсутствует конкретная ссылочная сборка. Но я не знаю, какая из них, поскольку страница, запрашивающая ресурс, очень сложна (я использую сторонние элементы управления и ASP.NET Ajax.)
Можно ли узнать по зашифрованному параметру строки запроса d, например:
.../WebResource.axd?d=...
какая сборка должна создавать контент и, возможно, отсутствует?
Примечание. Существуют другие вызовы WebRequest.axd, которые выполняются с успехом.
5 ответов
Одна из причин этой проблемы заключается в том, что зарегистрированный путь к встроенному ресурсу неверен или ресурса там нет. Убедитесь, что файл ресурса добавлен как встроенный ресурс.
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 UI для 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 считает, что встроенный ресурс находится в.
Я просто потратил часы на похожую проблему. Благодаря замечательной статье, на которую указал Диадистис, я смог расшифровать URL-адрес WebResource и выяснить, что мой WebResource был преобразован в неправильный указатель сборки, который распознается мусором перед именем вашего ресурса. После многих трудностей я обнаружил, что это потому, что я использовал Page.ClientScript.GetWebResourceUrl в классе, производном от другого класса, который находился вне сборки, в которой находился мой ресурс. Смущает то, что мой класс был в той же сборке, хотя класс, производный от был НЕТ. Параметр this.GetType() во многих статьях является обязательным, а в моей ситуации оказалось совсем не обязательным. На самом деле, его нужно было заменить на typeof(), и это сработало! Надеюсь, что это может помешать другим получить такую же головную боль, как я получил от этого педераста.
В моем случае источником ошибки 404 было то, что дата и время машины, на которой работал IIS, были неверными (из прошлого).
В вашем проекте отсутствуют какие-либо ссылки?
Есть ли какие-либо ссылки, установленные на CopyLocal=False (общие с ссылками на Infragistics или GAC), которые не попадают в пункт назначения?
Утилита, такая как рефлектор или обходчик зависимостей, сообщит вам, если в вашей основной сборке отсутствуют какие-либо зависимости, которые не очевидны сразу.
Есть ли в обработчике Application_Error в global.asax перехват, который генерирует какую-либо информацию об ошибке (FileNotFoundExceptions)?
Вы установили пользовательские ошибки как "только удаленные" и просматривали сайт с локального компьютера?
Эта же проблема возникает, если существует правило фильтрации запросов, которое обнаруживает указанную строку в строке запроса. В моем случае строка запроса для файла AXD была сгенерирована с двойным тире, обнаруженным правилом, и вызвала ошибку 404, не найденную для запроса файла AXD.