Domanda

Contrassegnato un file javascript come " risorsa incorporata "
Aggiunto l'attributo WebResource alla mia classe AssemblyInfo

Ora sto provando a inviare il javascript incorporato alla mia pagina principale. Tutto quello che ottengo è un & Quot; Risorsa Web non trovata & Quot; dall'URL della risorsa web.


Nome dell'Assemblea del progetto:

CompanyProduct


Spazio dei nomi predefinito del progetto:

Company.Product.Web


File Javascript individuato:
Library / Navigation.js


AssemblyInfo:

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


Codice nella pagina principale:

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

Errore del server nell'applicazione '/'.

Impossibile trovare la risorsa.

Descrizione: HTTP 404. La risorsa che stai cercando (o una delle sue dipendenze) potrebbe essere stata rimossa, se il suo nome fosse cambiato o fosse temporaneamente non disponibile. & nbsp; rivedi il seguente URL e assicurati che sia stato digitato correttamente.
URL richiesto: /WebResource.axd
Informazioni sulla versione: & nbsp; Versione di Microsoft .NET Framework: 2.0.50727.1433; Versione ASP.NET: 2.0.50727.1433

È stato utile?

Soluzione

Invece di this.GetType(), ottiene un tipo dall'assembly che contiene la risorsa .. cioè:

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

Funziona?

Altri suggerimenti

Sono venuto oggi allo stesso problema. Il problema sembra essere che AssemblyResourceLoader utilizza l'assembly contenente il tipo fornito al metodo GetWebResourceUrl (primo parametro) che nel tuo caso è un assembly creato dinamicamente per la pagina master (.master) e non contiene la risorsa che stai cercando . Suppongo che il tuo file di risorse sia incluso nello stesso assembly della tua pagina principale di base (file .master.cs), quindi puoi usare typeof per ottenere l'istanza Type

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

dove MyMasterPage è il nome della tua pagina principale

Sembra che sia anche possibile usare qualsiasi altro tipo dichiarato nello stesso assembly in cui è incorporata la risorsa.

Penso che tu voglia che i percorsi completi siano basati sullo spazio dei nomi, non sull'assemblaggio; Quindi ovunque tu abbia & Quot; CompanyProduct.Library.navigation.js & Quot ;, sostituiscilo con & Quot; Company.Product.Web.Library.navigation.js & Quot ;. Inoltre, esiste un metodo Page.ClientScript.RegisterClientScriptResource () che fa ciò di cui hai bisogno in un metodo (invece di usare RegisterClientScriptInclude (GetWebResourceUrl ()).

Questo è un po 'complicato, ma potrebbe essere che asp.net non sia impostato per elaborare correttamente webresource.axd? Se qualcosa è andato storto, forse il tag del gestore manca dal web.config della macchina?

Il tag dei gestori http di C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ web.config dovrebbe avere una voce webresource.axd come questa:

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

Controlla anche che non vi siano voci del gestore nel web.config del progetto che potrebbero sovrascrivere le impostazioni dal web.config della macchina.

Per chiunque utilizzi VB, esiste una differenza di comportamento tra il compilatore VB e il compilatore C #.

In VB la risorsa incorporata DEVE trovarsi al livello principale del progetto. Quando ho esaminato l'assembly generato con ILDASM ho scoperto che il nome della risorsa integrata non include MAI i nomi di eventuali sottocartelle. Questo alla fine fa sì che AssemblyLoader cerchi nel posto sbagliato la risorsa incorporata.

Quando ripeti l'esperimento con C #, esso include i nomi delle sottocartelle.

EDIT - Modificato per riflettere che per VB la risorsa deve essere a livello di root.

Quello che ho avuto successo è stato avere la risorsa integrata nella stessa cartella del codice che la utilizza (migliore per il controllo del codice sorgente). Ho quindi LIED nell'attributo AND la chiamata Page.ClientScript.GetWebResourceUrl per tenere conto del compilatore VB sostenendo che la risorsa incorporata non ha percorsi.

questo blog ha due anni ormai ... ma ho passato giorni a cercare di farlo funzionare. Sto cercando di ottenere un file js incorporato per darmi una stringa di query WebResource.asx che funzioni. L'ultimo pezzo che sembra essere lucido qui è che il file che hai incorporato DEVE trovarsi nella stessa struttura di directory fisica dei controlli code-behind da cui stai chiamando GetWebResourceUrl(). Se hai inserito il file incorporato in una cartella chiamata & Quot; scripts & Quot ;, quindi chiamato GetWebResourceUrl(typeof(MasterPage) dalla pagina principale che NON si trova in & Quot; scripts & Quot ;, il ResourceURL restituito punterà nella posizione sbagliata ... quindi restituendo SEMPRE un 404.

se si utilizza MasterPage come tipo per il primo parametro, non funzionerà mai. <=>, ... Immagino che la vera chiave qui sia che devi rilasciare la risorsa incorporata nella stessa posizione che intendi utilizzare come tipo per il primo parametro di ResourceURL. Dopo 3 giorni di lotta con questa cosa, ha finalmente trovato la mia risorsa.

Ho appena riscontrato questo problema e risolto in base alla risposta di meandmycode; tuttavia, forse è necessaria una spiegazione più dettagliata.

Quando si registra il blocco di script utilizzando il metodo ScriptManager.RegisterClientScriptInclude il " digitare " Il parametro deve essere di una classe all'interno dello stesso progetto dello script .js. Se non hai una classe associata al blocco di script, dovrai semplicemente scegliere un'altra classe.

Ho avuto un problema simile e, nel mio caso, è stato causato dal fatto che il parametro Page.ClientScript.GetWebResourceUrl nome risorsa è sensibile al maiuscolo .

La risposta alla tua domanda dipende completamente da dove hai questo file nel tuo progetto reale e da quale sia lo spazio dei nomi predefinito. Come menzionato da Chris, il percorso fornito ai metodi che registrano lo script richiede il percorso corretto per individuare la risorsa incorporata. Non abbini solo la stringa specificata in AssemblyInfo. La stringa deve essere il percorso corretto per la risorsa.

lt &; spazio dei nomi predefinito del progetto > / < tutte le sottocartelle in cui si trova il file in > / < nome file >

Trasforma questo;

Page.ClientScript.RegisterClientScriptInclude("NavigationScript"...

in questo;

Page.ClientScript.RegisterClientScriptInclude("CompanyProduct.Library.navigation.js"...

La risorsa che stai aggiungendo in un assembly diverso al codice che stai utilizzando per generare il tag script? In tal caso, penso che this.GetType () restituirà un riferimento a un tipo nell'assembly errato in modo che il codice risorsa Web non disponga dell'assembly giusto da cui caricare la risorsa.

Non so per certo che questo sarebbe un problema, ma mi sembra che il codice che ha generato il nome avrebbe bisogno di sapere su quale assembly si trovava la risorsa o non sarebbe in grado di mappare indietro a quello assembly quando ha ricevuto la richiesta dal browser.

Ho avuto una situazione simile e dopo circa 4 ore di ricerche e test ho ottenuto la soluzione finale: lo spazio dei nomi predefinito deve essere uguale al nome dell'assembly . (È possibile utilizzare Reflector o utilizzare lo snippet di codice seguente per ottenere i nomi delle risorse incorporate.

string[] embeddedResNames = Assembly.LoadFile("YourDll.dll").GetManifestResourceNames()

Come già menzionato meandmycode, il tipo passato a GetWebResourceUrl è la chiave

Non mi andava di passare il tipo dove non conta davvero, l'ho risolto con questo tipo di metodo di supporto

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);
}

Gli attributi [assembly:] devono trovarsi nel file Properties \ AssemblyInfo.cs. Anche se il progetto viene compilato quando gli attributi dell'assembly si trovano nel file di controllo personalizzato, non sono visibili a WebResource.axd.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top