Domanda

Ho un modulo VB.NET che legge da un file di risorse per visualizzare il testo nella lingua corretta. Ecco il mio problema: questo codice è condiviso tra un'applicazione Web e un'applicazione non Web. Nell'applicazione Web, sto usando System.Web.HttpContext per determinare la lingua preferita dell'utente, ma ora la mia app Windows non si compila nemmeno , perché dice che HttpContext non è definito (ho già provato ad aggiungere un'importazione per l'intero spazio dei nomi - nessun dado).

Mi piacerebbe usare un qualche tipo di blocco try / catch se non posso altrimenti aggirarlo, ma ciò non cambia che l'app di Windows non verrà compilata con un riferimento a HttpContext in esso. Senza spostare questo blocco di codice in un nuovo file e includerlo solo nell'applicazione Web (non possiedo quell'app, quindi preferirei non occuparmi di quelle implicazioni), c'è un'altra scelta che devo affrontare?

Se non ha senso, per favore fatemi sapere e farò del mio meglio per chiarire.

SOLUZIONE: ho appena aggiunto un riferimento a System.Web, che ha consentito la compilazione della mia applicazione. Ho anche racchiuso il riferimento HttpContext in un " If HttpContext.Current non è niente quindi ... Termina se " blocco, che lo fa saltare il codice se non è in esecuzione come applicazione web, che è esattamente quello che stavo cercando.

È stato utile?

Soluzione

Se si fa riferimento all'assembly System.Web, si dovrebbe quindi avere accesso a HttpContext.Current, che è un riferimento all'oggetto HttpContext dell'app Web attualmente in esecuzione. Se l'applicazione è una normale app Win32, questo riferimento dovrebbe essere un puntatore null. Quindi in C # useresti: if (HttpContext.Current == null) o in VB puoi usare: Se HttpContext.Current non è niente, allora

Tuttavia, non ho mai provato a fare qualcosa del genere, quindi non posso garantire il risultato. Fammi sapere se funziona per te.

Grazie, C

Altri suggerimenti

Anche se l'app venisse compilata, si otterrebbe il problema di nessun HttpContext in WinApp.

Potresti refactificare la webapp in modo che invece di HttpContext utilizzi un servizio ad es. IContextService o un gruppo di servizi (ICacheService, ISessionService, ecc.).

Vi sarebbero due implementazioni del servizio: una per l'app Web che utilizzava HttpContext e una per il winapp la cui implementazione conterrebbe la logica necessaria per determinare le preferenze dell'utente (lingua, ecc.)

Se le preferenze sono memorizzate sul server, dovrai implementare un qualche tipo di servizio per comunicare tra il tuo winapp e il server.

Penso che potresti usare un po 'di disaccoppiamento!

Se dovessi creare un'interfaccia come questa (ad esempio nel tuo livello BLL)

public interface IPreferredLanguage
{
     String PeferredLanguage { get; set; }
}

e creerai due implementazioni:

Nel progetto del tuo sito web:

public class WebPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get
          {
               return // retrieve the language from the http context
          }
          set
          {
               // set the preferred language in the HttpContext
          }
     } 
}

Nel tuo progetto Winforms:

public class WinformsPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get; set; // automatic properties
     } 
}

Di seguito usi Inversion of Control (Unity, StructureMap, MicroKernel) per configurare nel tuo webconfig che un'istanza di WebPeferredLanguage dovrebbe essere usata e un'istanza singleton di WinformsPeferredLanguage dovrebbe essere restituita nelle tue winform.

Nel tuo codice ogni volta che devi conoscere la lingua, chiedi semplicemente al contenitore IoC l'implementazione corretta di IPreferredLanguage e restituirà un oggetto del tipo che hai configurato.

quindi nel tuo bll potresti programmare (per esempio):

public String GetEmailMessage()
{
    var currentLanguage = IoC.Resolve<IPreferredLanguage>().PeferredLanguage;
    return Resources[currentLanguage ].EmailMessage;
}

Dopo aver scritto questo, vedo che volevi una soluzione VB.NET. Bene, gli esempi si applicano ancora, solo che è una grammatica leggermente diversa (scusate se è più difficile leggere in questo modo).

È possibile aggiungere System.Web.dll all'applicazione e quindi utilizzare HttpContext. Il problema è che non c'è un HttpContext nella tua applicazione vincente, quindi dovresti usare un servizio web o WCF per comunicare tra le due applicazioni.

Se possibile, la cosa probabilmente migliore che potresti fare è rimuovere completamente la dipendenza dall'avere un contesto HTTP nell'assembly condiviso.

Ad esempio, il metodo menzionato che utilizza HttpContext per ottenere il preferito dall'utente può essere riformattato in modo che la lingua venga invece fornita come parametro. Quando chiami il metodo dall'applicazione web, puoi passare la lingua da HttpContext e quando lo chiami dall'applicazione Windows dovrai passare la lingua da un'altra fonte.

Dovresti usare

Thread.CurrentUICulture

per determinare la lingua dell'utente. È supportato anche in WinForms e WebApplication.

Il framework .NET lo imposta per te nella maggior parte dei casi.

Puoi impostarlo all'avvio del tuo programma / thread. Nell'applicazione Web è possibile impostarlo in Global.asax.cs in Application_BeginRequest.

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