2009-03-08 7 views
3

Ich wurde gesagt, das funktioniert, aber ...Können Sie die Sitzungsvariablen zwischen zwei .net 2.0 + -Anwendungen teilen?

Ich denke, ich bin nur nicht bekommen, es scheint, es gibt einen versteckten Schritt, den ich vermisse, kann jemand das korrigieren oder meinen Fehler aufzeigen? Vielen Dank.

Ich habe eine leere Lösung:
- innerhalb von zwei Webanwendungen
1) WebApp1 .net 2.0 ist
2) webapp2

Ich möchte, dass sie die gleichen Session-Daten teilen.

Meine Seite Setups:

Anwendung 1:

Session("value") = "this is the value" 

Anwendung 2:

If Not (Session("value") Is Nothing) Then 
    value = Session("value").ToString() 
End If 

Mein Denkprozess: go

1) zu Dienstleistungen, schalten Sie den asp .net state service
2) Öffnen Sie die Webkonfigurationen in b andere Projekte: Setzen Sie die

< machineKey 
validationKey="BFE2909A81903BB303D738555FEBC0C63EB39636F6FEFBF8005936CBF5FEB88CE327BDBD56AD70749F502FF9D5DECF575C13FA2D17CA8870ED21AD935635D4CC" 
decryptionKey="2A86BF77049EBA3A2FA786325592D640D5ACD17AF8FFAC04" validation="SHA1" /> 
< sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" 
cookieless="false" timeout="20"/> 

in beiden Standorten.
3) kompilieren und testen Sie die Website
4) werden enttäuscht, weil es nicht funktioniert. Ich sehe die Sitzung nie in der zweiten Webanwendung.

Antwort

3

Warum möchten Sie Sitzungen zwischen Anwendungen teilen? ASP.NET-Sitzung ist nicht dafür vorgesehen.

Ihre vorgeschlagene Lösung, denselben ASP.NET-Statusserver zu verwenden, funktioniert nicht, da Ihr Benutzer einfach zwei verschiedene Sitzungstoken erhält, auch wenn sie Ihre zwei Anwendungen gleichzeitig von demselben Computer und demselben Browser verwenden. Sie müssen überlegen, wie Session funktioniert, um zu verstehen, warum dies so ist.

Von MSDN:

ASP.Der NET-Sitzungsstatus ermöglicht das Speichern und Abrufen von Werten für einen Benutzer , während der Benutzer ASP.NET-Seiten in einer Webanwendung navigiert. HTTP ist ein zustandsloses Protokoll. Dies bedeutet, dass ein Webserver jede HTTP-Anforderung für eine Seite als unabhängige Anforderung behandelt. Der Server behält keine Kenntnis der Variablenwerte, die bei früheren Anforderungen verwendet wurden. ASP.NET-Sitzungsstatus identifiziert Anforderungen aus demselben Browser während ein begrenztes Zeitfenster als eine Sitzung und bietet eine Möglichkeit, Variablenvariablen für die Dauer dieser Sitzung beizubehalten.

ASP.NET Session ist eine Metapher für eine aktuelle Interaktion des Benutzers mit einer ASP.NET Anwendung. Es existiert in ASP.NET, um uns einen Platz zum Speichern temporärer Statusdaten zwischen den verschiedenen Seitenanforderungen zu geben, die ein Benutzer während der Verwendung der Anwendung ausführt.

Wenn Ihre Anwendungen sehr eng verwandt sind, z. Wenn der Benutzer beide gleichzeitig oder fast zur gleichen Zeit verwendet, könnten Sie in Betracht ziehen, sie zu einer einzigen ASP.NET-Anwendung zusammenzuführen. Sie können sie in verschiedenen virtuellen Verzeichnissen bereitstellen, um ein gewisses Maß an logischer Trennung beizubehalten, aber nur eine Anwendung in IIS verwenden.

Wenn Ihre Anwendungen nicht so eng verwandt sind, sollten sie vielleicht die gleiche Datenbank als Mittel zum Datenaustausch nutzen oder eine API, z. basierend auf Web Services zum Austausch von Informationen.

+8

Dies ist keine Antwort. "Warum willst du das machen?" == "Ich weiß nicht, wie ich das machen soll". Manche Leute haben Websites, die aus verschiedenen Gründen (Unternehmensentscheidungen oder was auch immer) nicht zusammengeführt werden können. Wenn es einen Weg gibt, dies zu tun, sollte es erforscht werden, nicht einfach ignoriert werden. – mikeschuld

+0

@mikeschuld Die Sitzungsmetapher gilt für die aktuellen Interaktionen eines Benutzers mit einer einzelnen ASP.NET-Anwendung und ist außerhalb dieses Anwendungsfalls nicht geeignet. Wenn Sie sich einmal außerhalb der Session-Metapher bewegen, werden Sie feststellen, dass es viele andere Möglichkeiten gibt, Daten zu teilen, und eine weitaus bessere Lösung wäre, andere Optionen zu erkunden. Ich habe angedeutet, die Apps zusammenzuführen oder die gleiche DB zu teilen oder zwischen Apps zu kommunizieren, weil ich glaube, dass das eine weitaus bessere Lösung ist, Session zu hacken, um Dinge zu tun, für die es nicht vorgesehen ist. – saille

5

Sie können keine Sitzungen zwischen verschiedenen ASP.NET-Anwendungen ohne benutzerdefinierten Code freigeben. Was Sie in web.config getan haben, war die Verwendung einer Out-of-Process-Sitzung, was bedeutet, dass Daten nicht mehr im Speicher, sondern im Speicher eines dedizierten Rechners gespeichert werden. Dies ist nützlich für Serverfarmen und es verwendet den ApplicationName, um zu wissen, zu welcher Anwendung die Session gehört. Im Grunde müssen Ihre Anwendungen denselben Namen haben, wenn Sie möchten, dass Sitzungen geteilt werden. Es gibt einige schmutzige workarounds obwohl.

+0

das funktionierte nicht für mich, und es sieht so aus, als ob es für fast niemanden dort auch funktioniert hat ... wie stellst du den Anwendungsnamen ein? Ich kann einen SQL-Server nicht verwenden, ich brauche State Server oder in Prozess. –

+0

waren Sie in der Lage, diese Problemumgehung zu "arbeiten" –

+0

In meiner persönlichen Erfahrung musste ich nie Sitzungsstatus zwischen zwei verschiedenen ASP.NET teilen Anwendungen, so kann ich nicht garantieren. Die Lösung auf CodeProject scheint hacky aber IMHO sollte es funktionieren. –

1

Sie geben Sitzungsdaten frei, wenn sie sich im selben App-Pool befinden und der Sitzungsmodus auf inproc festgelegt ist. Die Art und Weise, wie stateserver und sqlstate funktionieren, ist die Verwendung der Wurzel Ihrer Webadresse als logische Grenzen.

ZB wenn sie beide auf der gleichen Adresse gehostet werden und Port (oder ‚Standort‘ in iis), aber in verschiedenen sibfolders dann sollten sie Sitzung gemeinsam nutzen, denke ich.

+1

das wird funktionieren, weil die Projekte als ein Projekt kompiliert werden würden, ja, aber wir wollen das nicht, wir wollen beide Projekte separat kompilieren und sie dann Seite für Seite bereitstellen - verschiedene virtuelle Verzeichnisse. –

+0

Ich habe das gleiche versucht, funktioniert immer noch nicht auf diese Weise entweder –

1

Außerdem müssen beide Apps auf derselben Domäne ausgeführt werden, sodass der Benutzerbrowser ein Cookie zum Speichern der Sitzungs-ID verwendet.

+0

Ich habe das gleiche versucht, funktioniert immer noch nicht auf diese Weise entweder –