Page.ResolveUrl in head runat="server"

Per utilizzare il metodo Page.ResolveUrl all'interno del tag head con l'attributo runat="server", è sufficiente utilizzare il simbolo # al posto dell' =, come di seguito riportato:
<head runat="server">
<link rel="stylesheet" type="text/css" href="<%#ResolveUrl("~/script/somefile.css")%>" />
</head>
e richiamando Page.Header.DataBind() nella Sub Page_Load()
Public Sub page_load()
        Page.Header.DataBind()
End Sub

ASP.NET Routing e Authorization

Ho utilizzato il routing asp.net per la gestione delle lingue in un sito web registrando nell'Application_Start del Global.asax:
routes.Add("en", New Route("en/{*path}", New GlobalizationRouteHandler(CultureInfo.GetCultureInfo("en"))))
routes.Add("it", New Route("it/{*path}", New GlobalizationRouteHandler(CultureInfo.GetCultureInfo("it-IT"))))
In questo modo una pagina in lingua inglese viene riscritta come http://www.miosito.com/it/pagina.aspx ed un pagina in lingua inglese come http://www.miosito.com/en/pagina.aspx.
Il problema di questa tecnica nasce nel momento in cui alcune pagine appartengono a direttori il cui accesso è limitato dall' "access rules" standard, aggiungendo quindi al direttorio un file web.config simile al seguente che permette l'accesso al solo ruolo "Admin":
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>
Pertanto l'url http://www.miosito.com/direttorio/pagina.aspx viene reindirizzato alla pagina di login a meno che l'utente non sia identificato ed appartenente al ruolo Admin.
Se però l'indirizzo diventa http://www.miosito.com/it/direttorio/pagina.aspx, ovvero l'indirizzo riscritto dal routing, la limitazione imposta nel web.config sembra non funzionare ed è possibile accedere alla pagina protetta!
Per prevenire questo fenomeno è sufficiente aggiungere al web.config principale del sito:
<location path="it/direttorio">
        <system.web>
            <authorization>
                <allow roles="Admin"/>
                <deny users="*" />
            </authorization>
        </system.web>
    </location>

    <location path="en/direttorio">
        <system.web>
            <authorization>
                <allow roles="Admin"/>
                <deny users="*" />
            </authorization>
        </system.web>
    </location>

ASP.NET Ajax client-side framework failed to load su

Improvvisamente e senza alcuna ragione, una mia applicazione su hostforlife.com ha smesso di funzionare correttamente.

La console degli errori di Firefox restituiva il seguente errore:

ASP.NET Ajax client-side framework failed to load
'Sys' is undefined.

esguendo pagine in cui era inserito <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"/>.

Ho risolto il problema aggiungendo nel web.config la seguente sezione:

<handlers> 
    <remove name="WebServiceHandlerFactory-Integrated"/> 
    <remove name="ScriptHandlerFactory"/> 
    <remove name="ScriptHandlerFactoryAppServices"/> 
    <remove name="ScriptResource"/> 
    <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
    <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
</handlers>

Redirect per Manutenzione di applicazioni con app_offline.htm

Spesso sorge l'esigenza di impedire al sito di produzione di rispondere alle richieste di pagina per poter svolgere agevolmente le operazioni di aggiornamento o distribuzione di un applicazione web.

In tale contesto gli utenti dovranno così essere reindirizzare ad una pagina di "Sito in muntenzione"; cioò permette di evitare errori che potrebbero verificarsi quando le modifiche sono completate solo parzialmente.

Il modo più semplice per assolvere a tale necessità è di seguire quanto riportato nell'articolo http://msdn.microsoft.com/it-it/library/ff925031.aspx, ovvero
  • Creare un file denominato App_offline.htm (di dimensioni  maggiori di 512 byte) e includervi un messaggio per comunicare agli utenti che il sito non è disponibile perché è in fase di aggiornamento.
  • Posizionare il file App_offline.htm nella cartella radice del sito Web di destinazione.

    Di fatto questa feature era già presente nella versione 2.0 di ASP.NET. La presenta della pagina app_offline.htm provoca lo shutdown dell'Appdomain e diventa l'unica pagina vista da chiunque tenti di connettersi al sito.

Come mantenere invariato il formato valuta in ASP.NET in un'applicazione multi lingua

Le impostazioni linguistiche in una pagina ASP.NET sono dipendenti da due proprietà: Culture e UICulture. 
La proprietà Culture deterimina il risultato delle funzioni dipendenti dalle impostazioni lingiuistiche come ad esempio l'uso delle maiuscole e delle minuscole, la formattazione di date e numeri, il formato della valutam, il confronto tra stringhe ecc...
La proprietà UICulture determina quali risorse devono essere caricate per la pagina.
Da questa premessa è quindi semplice comprendere come è possibile mantenere invariato il formato della valuta in un'applicazione multilingua: sarà sufficiente infatti mantenere costante il valore della proprietà Culture e cambiare la propietà UICulture per caricare di volta in volta le risorse della pagina in base alla lingua selezionata.
Ciò è possibile  eseguendo l'override del metodo InitializeCulture in ogni pagina dell'applicazione. Volendo quindi mantenere costante il formato della valuta all'€, per ogni pagina sarà sufficiente richiamare la seguente Sub:
Protected Overrides Sub InitializeCulture()
        ' Culture: valore costante
        Thread.CurrentThread.CurrentCulture = New CultureInfo("it-IT")

        ' UI Culture: valore contenuto nella variabile di Sessione Session("UICulture")
        Dim c As CultureInfo
        If Session("UICulture") IsNot Nothing Then
            c = DirectCast(Session("UICulture"), CultureInfo)
        Else
            c = New CultureInfo("it-IT")
        End If

        Thread.CurrentThread.CurrentUICulture = c

        MyBase.InitializeCulture()
    End Sub
in cui il valore di UICulture è determinato dalla variabile di Sessione UICulture in modo che diventi comune a tutte le pagine.