2016-03-10 13 views
5

ASP.NET Middleware erhalten keine Kultur mehr

asp.net 4 mit mvc 5.2.3 und .net Gegeben 4.6.1

Ich möchte auf einige die Current Unterstützung Globalisierung ändern basierend Anfrage ähnliche Dinge wie der Gastgeber.

Eine Owin-Middleware, die eine Kultur setzt.

vereinfachte Version, die das Verhalten erzeugt:

public override async Task Invoke(IOwinContext context) 
{ 
     var culture = new CultureInfo("es-ES"); 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 

     CultureInfo.CurrentCulture = culture; 
     CultureInfo.CurrentUICulture = culture; 


     await Next.Invoke(context); 
    } 

Problem:

Die Kultur wird nicht beibehalten So zum Beispiel eines Web-Controler nicht die Kultur haben, die in der Middleware gesetzt wurde .

Dies scheint nicht mit dem Thema Thread Culturpreserve Problem verbunden sein. Wie wenn man nur einige Methoden nennt und auf sie wartet, bleibt die Kultur erhalten.

Obwohl mit 4.5.1 funktioniert es. (Ich habe es bereits auf diese Weise auch in anderen Projekten) Und wenn ich die Httpruntime-Version wie folgt zu ändern:

<httpRuntime targetFramework="4.5.1" /> 

alles wirkt wie ein Zauber.

Ich kann keine dokumentierte Bruchänderung dafür finden. irgendein Hinweis? Ich kann es mit einem leeren neuen ASP-Projekt reproduzieren Irgendwelche Ratschläge?

Ein Zusatz.

Dieses Problem ist nicht im Zusammenhang mit Erhaltung der Kultur auf Thread als dies funktioniert gut!

 CultureInfo.CurrentCulture = new CultureInfo("en-GB"); 
     await Foo(); 
     Debug.WriteLine(Thread.CurrentThread.CurrentCulture);// Works is en-gb 
    } 

    private Task Foo() 
    { 
     Debug.WriteLine(Thread.CurrentThread.CurrentCulture);// Works is en-gb 
     return Task.FromResult(true); 
    } 

Antwort

0

Ich eröffnen hier eine Supportanfrage bei Microsoft dort antworten:

Vielen Dank für die Meldung des Problems. Wir hatten eine Änderung in der Einstellung der aktuellen Kulturen in 4.6. Die Änderung setzt die aktuellen Kulturen Reisen mit den asynchronen Operationen. Wenn Sie also die Kultur während der asynchronen -Operation auf den aktuellen asynchronen Ausführungskontext und festlegen, wenn die asynchrone Operation abgeschlossen ist und zurück zum ursprünglichen Ausführungskontext wechseln, wird die Kultur auf die Kultur in diesem Kontext zurückgesetzt.Sie können mehr darüber in der gleichen lesen https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(v=vs.110).aspx#Async

Wir bieten immer noch eine Möglichkeit für Sie, das alte Verhalten zu bekommen, wenn Sie wollen. Sie können durch Ausführen des folgenden Code auf das alte Verhalten wieder in der App-Initialisierung:

static string NoAsyncCurrentCultureFlagName = @"Switch.System.Globalization.NoAsyncCurrentCulture"; 
AppContext.SetSwitch(NoAsyncCurrentCultureFlagName, true); 
+0

Scheint nicht mehr zu funktionieren. Wie hast du das Problem gelöst? EDIT: es scheint, du hast die Lösung selbst beantwortet ein anderes Thema: http://StackOverflow.com/a/37520214/1842261 – hbulens

+0

ja die Lösung dort beschrieben funktioniert für mich –

1

Diese article sieht aus, als was Sie brauchen.

Verwenden Sie die app.UseRequestLocalization(); in der Configure-Methode?

UPDATE

Werfen Sie einen Blick auf diese module. Ich habe das Beispiel heruntergeladen und es funktioniert (Sie müssen einige nuget-Pakete aktualisieren, um es zu erstellen.) Das Beispiel funktioniert, indem die Kultur in der URL zur Verfügung stellt, aber das kann konfiguriert werden. Dies funktioniert mit .NET 4.6.1.

+0

Dies ist für asp 5/Kern, ich weiß, dass es andere/weitere Möglichkeiten, aber ich habe asp 4, asp mvc 5.2.4. aber das ist sitl la gute ressource für asp 5 ill upvotre –