2010-10-19 20 views
18

Wir verfügen über eine ASP.NET-Website, die den SQL Server-Sitzungsstatus verwendet. Der Staat ist in Web.config wie konfiguriert:Konfigurieren des ASP.NET-Sitzungsstatus zur Laufzeit

<sessionState mode="SQLServer" sqlConnectionString="data source=TheServer; 
    User ID=TheUser;password=ThePassword;" cookieless="false" timeout="480"/> 

Aber es gibt drei Umgebungen (Entwicklung/Inszenierung/Produktion). Alle anderen Verbindungszeichenfolgen sind wie folgt konfiguriert:

Zur Laufzeit wählen wir eine aus, um eine Verbindung zur Datenbank basierend auf dem Hostnamen herzustellen. Leider scheint die Verbindungszeichenfolge für den Sitzungsstatus in web.config fest codiert zu sein.

Gibt es eine Möglichkeit, den SQL Server-Sitzungsstatus zur Laufzeit zu konfigurieren oder auf eine Verbindungszeichenfolge im Abschnitt connectionStrings zu verweisen?

+0

Also im Grunde haben Sie Informationen über alle Umgebungen in einer Konfigurationsdatei? Möchten Sie nicht eine Datei pro Umgebung verwenden? –

+0

@ GôTô: Ja, alle Informationen für alle Umgebungen befinden sich in einer Konfigurationsdatei. Da ich hier auf einem relativ alten System arbeite, besteht meine Aufgabe darin, es vom In-Process- in den SQL Server-Zustand zu tauschen. – Andomar

+1

Das ist eine gute Frage im Allgemeinen, aber ich mag die Idee nicht, alle Verbindungszeichenfolgen an einem Ort zu halten. Zu viel Chance, dass die Produktion in die Entwicklungsumgebung schreibt oder umgekehrt ... – RedFilter

Antwort

17

Wie sich herausstellte, gibt es eine ziemlich einfache Art und Weise war dies zu tun. Der Sitzungsstatus bietet eine Funktion namens Partitioning, in der Sie Ihren Status auf mehrere SQL Server verteilen können. Sie können eine Funktion zum Auswählen des SQL Servers basierend auf der Sitzungs-ID (SID) bereitstellen. Der Trick besteht darin, dass Sie diese Funktion mit EINEM Server nutzen können, nur um den Server dynamisch auszuwählen.

Die web.config Konfiguration wie folgt aussieht:

<sessionState mode="SQLServer" 
       partitionResolverType="YourNamespace.PartitionResolver" 
       cookieless="false" 
       timeout="60" /> 

Die Funktion, die die SQL Server wählt wie folgt aussieht:

public class PartitionResolver : IPartitionResolver 
{ 
    public void Initialize() {} 

    // The key is a SID (session identifier) 
    public String ResolvePartition(Object key) 
    { 
     return <grab your config here>; 
    } 
} 

Dieser Ansatz erlaubt uns sowohl für die Produktion mit einer web.config fortzusetzen und Entwicklung .

+1

+1 für eine großartige und einfache Lösung. Klappt wunderbar – JOpuckman

1

Laut diesem Artikel können Sie die Sitzungsstatus-Provider anpassen:

http://www.exforsys.com/tutorials/asp.net-2.0/asp.net-2.0-customizing-the-session-state-mechanism.html

Die hier Informationen verwendet werden könnten, eine umwelt bewusst Sitzungsstatus Anbieter zu entwerfen, die die Verbindungszeichenfolge auf einer Basis wählen könnten Konfiguration in der .config-Datei oder einem anderen Umgebungsschlüssel.

+0

Ich müsste den SQL-Session-State-Provider neu implementieren? Autsch – Andomar

+0

Sie möchten es nicht komplett neu implementieren. Sie sollten versuchen, einen benutzerdefinierten Suchmechanismus für SQL-Verbindungszeichenfolgen über den vorhandenen SQL-Sitzungsanbieter zu legen. –

+0

Der vorhandene SQL-Sitzungsanbieter verwendet jedoch die Verbindungszeichenfolge aus der Datei "Web.config". Wie könnte ich das wiederverwenden? – Andomar

3

Wie oben erwähnt, ich denke, Sie sollten nicht beide Dev-und Prod-Verbindungen Zeichenfolgen in der web.config. Sie können ein Webbereitstellungsprojekt verwenden, um dieses Problem zu lösen. Sie können ein Webbereitstellungsprojekt verwenden, um Ihre Konfigurationseinstellungen basierend auf dem Build zu ersetzen. Zum Beispiel könnten Sie zwei externe Konfigurationsdateien namens connectionStrings.dev.config und connectionStrings.prod.config haben. Wenn Sie in Debug erstellen, würde es die dev.config verwenden, aber wenn Sie in Release erstellen, würde es prod.config verwenden.

Es ist ein wenig anders als VS 08 und 10. Hier sind einige Referenzen:

VS 2008 - http://johnnycoder.com/blog/2010/01/07/deploy-aspnet-web-applications-with-web-deployment-projects/

VS 2010-http://www.hanselman.com/blog/WebDeploymentMadeAwesomeIfYoureUsingXCopyYoureDoingItWrong.aspx