2010-05-19 27 views
43

Tôi đang cố gắng chia sẻ phiên giữa hai ứng dụng web, cả hai được lưu trữ trên cùng một máy chủ. Một là một ứng dụng web 2.0 hình thức ứng dụng khác là như .net 3.5 MVC2 ứng dụng.Chia sẻ phiên trên các ứng dụng bằng ASP.NET Session State Service

Cả hai ứng dụng này đã phiên của họ thiết lập như thế này:

<sessionState 
     mode="StateServer" 
     stateConnectionString="tcpip=127.0.0.1:42424" 
     /> 

Trong ứng dụng Webform Tôi gửi bài session key để ứng dụng MVC:

protected void LinkButton1_Click(object sender, EventArgs e) 
{ 
    Session["myvariable"] = "dan"; 
    string sessionKey = HttpContext.Current.Session.SessionID; 

    //Followed by some code that posts sessionKey to the other application  
} 

sau đó tôi nhận được nó trong Ứng dụng MVC và thử sử dụng cùng một phiên như sau:

[HttpPost] 
public void Recieve(string sessionKey) 
{ 
    var manager = new SessionIDManager(); 

    bool redirected; 
    bool IsAdded; 

    manager.SaveSessionID(HttpContext.ApplicationInstance.Context, Id, out redirected, out IsAdded); 
    var myVar = Session["myvariable"]; 

} 

Chìa khóa đang được đăng nhưng phiên dường như không được tải trong ứng dụng MVC, tức là sessionKey là null. Tôi có thể cố gắng làm gì không?

+0

Bạn có thể đăng mã để đăng id phiên cho ứng dụng khác – kk1076

+0

https://blogs.msdn.microsoft.com/toddca/2007/01/25/sharing-asp-net-session-state-across-applications/ – sotn

+0

Liên kết trong nhận xét @sotn (https://blogs.msdn.microsoft.com/toddca/2007/01/25/sharing-asp-net-session-state-across-applications/) cho biết cách gây ra phiên SQL nhà cung cấp trả lại cùng một id ứng dụng cho tất cả các ứng dụng, để họ chia sẻ cùng một phiên một cách hiệu quả – AgapwIesu

Trả lời

68

tôi đã làm nó theo cách này:

Về cơ bản các ý tưởng là cả hai ứng dụng sử dụng có nguồn gốc sessionState .net lưu trữ trong sqlserver. Bằng cách sử dụng cùng một phím máy và thực hiện một tinh chỉnh nhỏ cho một thủ tục được lưu trữ - cả hai ứng dụng có thể chia sẻ bất kỳ khóa phiên và/hoặc hình thức xác thực.

Cả hai ứng dụng sẽ làm một cái gì đó như thế này trong web.config của họ:

<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\SQLEXPRESS;User Id=test;Password=test;Application Name=AppName" /> 
    <machineKey 
validationKey="SOMEKEY" 
validation="SHA1" decryption="AES" 
/> 

phiên db nhà nước sẽ cần phải được thiết lập trên một máy chủ cơ sở dữ liệu, mà cả hai ứng dụng có thể nhìn thấy.

Documents để làm điều này: http://msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

lệnh đó sẽ cần phải được chạy: C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin> aspnet_regsql.exe -E -ssadd - . -sstype p -S \ SQLEXPRESS

thủ tục lưu trữ (TempGetAppID) tinh chỉnh để:

@appId int OUTPUT 
AS 

    -- start change 

    -- Use the application name specified in the connection for the appname if specified 
    -- This allows us to share session between sites just by making sure they have the 
    -- the same application name in the connection string. 
    DECLARE @connStrAppName nvarchar(50) 
    SET @connStrAppName = APP_NAME() 

    -- .NET SQLClient Data Provider is the default application name for .NET apps 
    IF (@connStrAppName <> '.NET SQLClient Data Provider') 
     SET @appName = @connStrAppName 

    -- end change 

SET @appName = LOWER(@appName) 
+1

Đối với quy trình được lưu trữ (giả sử bạn không cần giải pháp có khả năng mở rộng hơn), bạn có thể chỉ cần mã hóa tên ứng dụng: 'SET @appName = LOWER (" MyAppNameHere ")' –

+1

Cuộc sống không hoàn hảo. Giải pháp này có một số sai lầm. Tôi đã bắt đầu sử dụng nó và nhận thấy rằng các hàng phiên lỗi thời không bị xóa khỏi db. Vì vậy, nó cực kỳ phát triển và tôi nhận được ngoại lệ "Nhật ký giao dịch cho cơ sở dữ liệu 'ASPState' đã đầy." sau một thời gian. Làm thế nào tôi có thể sửa chữa nó? – RredCat

+0

Hơn nữa ASPState_log.LDF mất ~ 50GB 8 | – RredCat

9

Vấn đề là các khóa phiên được dàn xếp cho các ứng dụng, do đó, hai ứng dụng có cùng một khóa phiên trong thực tế có các phiên riêng biệt.

Bạn có thể làm một trong hai điều:

  1. Đặt cả hai ứng dụng như một thư mục ảo dưới một ứng dụng IIS chung. Tôi không nghĩ rằng đây là một ý tưởng hay, nhưng nó sẽ hoạt động.

  2. Cuộn giải pháp dữ liệu phiên của riêng bạn cho dữ liệu bạn muốn chia sẻ. Có thể sử dụng cơ sở dữ liệu phụ trợ làm bộ nhớ chung, nếu bạn có bộ nhớ đó.

Dựa trên nhận xét của Justin, chỉ cần làm rõ tùy chọn 2 không đề cập đến quản lý nhà nước SQL trong các phiên quá trình. Ý tôi là bạn thực sự quản lý dữ liệu được chia sẻ theo cách thủ công trong hai phiên, có thể sử dụng cơ sở dữ liệu.

+0

Tôi cũng sẽ đề xuất sử dụng cơ sở dữ liệu cho giải pháp quản lý phiên. Nó rất dễ dàng để thiết lập nhưng bạn có thể chạy vào cùng một vấn đề ứng dụng khác nhau sẽ có các phím khác nhau và không thể chia sẻ dữ liệu. – Justin

+0

@Justin, tôi không gợi ý rằng OP sử dụng phiên ASP.NET trong SQL Server. Điều này chắc chắn sẽ có cùng một vấn đề, các khóa phiên trong ASP.NET là phạm vi ứng dụng, bất kể sự kiên trì. Tôi có nghĩa là OP hoàn toàn nên quản lý lưu trữ dữ liệu được chia sẻ "thủ công" và chỉ sử dụng cơ chế phiên ASP.NET cho dữ liệu phiên ứng dụng cụ thể nếu cần. –

+0

@Dan, điều là bạn đang trộn hai ứng dụng vào một phạm vi. Giờ đây, bạn không chỉ chia sẻ dữ liệu phiên mà còn cả hai ứng dụng được tải vào cùng một miền ứng dụng, nơi dữ liệu tĩnh, biến ứng dụng, biến bộ nhớ cache tất cả có khả năng tác động lẫn nhau, chỉ vì bạn muốn chia sẻ dữ liệu phiên. –

0

Bạn có thể sử dụng một chìa khóa máy thông thường để tạo ra cùng một Session ID trong cả hai ứng dụng cho một người dùng nhất định. Ngoài ra, bạn cũng nên lập kế hoạch lưu trữ phiên của cả hai ứng dụng trong một cửa hàng chung như ASP.Dịch vụ Nhà nước NET hoặc bộ nhớ cache được phân phối.

Bạn có thể sử dụng bộ nhớ cache được phân phối NCache, tính năng chia sẻ phiên giữa các ứng dụng khác nhau. Bạn chỉ định cùng một thẻ ID ứng dụng cho cả hai ứng dụng bên trong cài đặt trạng thái phiên cho phép bạn chia sẻ đối tượng phiên được cung cấp bạn có cùng một ID phiên được tạo cho cả hai ứng dụng.

Các vấn đề liên quan