Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET: WebResource.axd call 404 error: how to know which assembly/resource is missing or responsible?

Tags:

I get a 404 HTTP status error (not found) on a specific WebResource.axd call inside an ASP.NET 3.5 (AJAX) web application. I guess the error is thrown because a specific referenced assembly is missing in the bin folder/GAC. But I don't know which, since the page which requests the resource is very complex (I'm using third-party controls and ASP.NET Ajax.)

Is it possible to know from the encrypted "d" querystring parameter of the query, like:

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

which assembly should create the content and is possibly missing?

Note: There are other WebRequest.axd calls which execute with success.

like image 970
splattne Avatar asked Jan 12 '09 12:01

splattne


1 Answers

One of the reasons for this issue is that the registered embedded resource path is incorrect or the resource is not there. Make sure the resource file is added as a Embedded Resource.

Asp.net uses the WebResourceAttribute which you must give the path to the resource.

The resource file needs to be added as a Embedded Resource to the project and the path to it would be the full namespace plus the file name.

So you have the following project resource "my.js" in the project "MyAssembly" the resource path would be "MyAssembly.my.js".

To check what file the web resource handler is not finding you can decrypt the hash code provided on the WebResource.axd url. Please see the example below an how to do that.

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?";             }          }     } } 

Original code example by Telerik UI for 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

This should return the URL path that aspt.net believes the embedded resource is at.

like image 110
Diadistis Avatar answered Sep 20 '22 19:09

Diadistis