Cố gắng truy cập HttpContext.Current
trong cuộc gọi phương thức để tôi có thể sửa đổi biến số Session
, tuy nhiên tôi nhận được ngoại lệ HttpContext.Current
là null
. Phương thức gọi lại được kích hoạt không đồng bộ, khi đối tượng _anAgent
kích hoạt nó.HttpContext.Current is null trong Gọi lại không đồng bộ
Tôi vẫn không chắc chắn về giải pháp này sau khi xem similarquestions trên SO.
Một phiên bản đơn giản hóa của mã của tôi trông giống như vậy:
public partial class Index : System.Web.UI.Page
protected void Page_Load()
{
// aCallback is an Action<string>, triggered when a callback is received
_anAgent = new WorkAgent(...,
aCallback: Callback);
...
HttpContext.Current.Session["str_var"] = _someStrVariable;
}
protected void SendData() // Called on button click
{
...
var some_str_variable = HttpContext.Current.Session["str_var"];
// The agent sends a message to another server and waits for a call back
// which triggers a method, asynchronously.
_anAgent.DispatchMessage(some_str_variable, some_string_event)
}
// This method is triggered by the _webAgent
protected void Callback(string aStr)
{
// ** This culprit throws the null exception **
HttpContext.Current.Session["str_var"] = aStr;
}
[WebMethod(EnableSession = true)]
public static string GetSessionVar()
{
return HttpContext.Current.Session["str_var"]
}
}
Không chắc nếu cần thiết nhưng lớp WorkAgent
của tôi trông giống như vậy:
public class WorkAgent
{
public Action<string> OnCallbackReceived { get; private set; }
public WorkAgent(...,
Action<string> aCallback = null)
{
...
OnCallbackReceived = aCallback;
}
...
// This method is triggered when a response is received from another server
public BackendReceived(...)
{
...
OnCallbackReceived(some_string);
}
}
gì sẽ xảy ra trong các mã:
Nhấp vào nút gọi phương thức SendData()
, bên trong này _webAgent
sẽ gửi thư đến máy chủ khác và chờ trả lời (trong khi đó người dùng vẫn có thể tương tác với trang này và tham khảo cùng một số SessionID
). Sau khi nhận được, nó gọi phương thức BackendReceived()
. Quay lại trang .aspx.cs gọi phương thức Callback()
.
Câu hỏi:
Khi WorkAgent
gây nên các phương pháp Callback()
nó cố gắng truy cập HttpContext.Current
đó là null
. Tại sao trường hợp nếu tôi tiếp tục, bỏ qua ngoại lệ, tôi vẫn có thể nhận được cùng một số SessionID
và biến số Session
bằng cách sử dụng phương thức ajax trả về phương thức GetSessionVar()
.
Tôi có nên bật cài đặt aspNetCompatibilityEnabled không?
Tôi có nên tạo một số loại asynchronous module handler không?
Điều này có liên quan đến Integrated/Classic mode không?
Tại sao phức tạp này bằng cách sử dụng callbacks, một giải pháp tốt hơn có thể được sử dụng ajax từ phía khách hàng, như vậy người dùng vẫn có thể tương tác với trang web. Và cuộc gọi đến hệ thống khác chỉ có thể là một phương thức bình thường gọi là – 3dd
Ajax * được * sử dụng từ phía máy khách cho hầu hết các phần, chỉ cần không bao gồm nó trong mã trên (nó cập nhật các biến 'HttpContext Session' và cơ sở dữ liệu SQL) . Phương thức duy nhất không phải là một cuộc gọi ajax là 'SendData()'. Điều này sẽ gửi dữ liệu đến * một số máy chủ * khác. Tôi chỉ nhầm lẫn tại sao 'HttpContect.Current' trở thành ** null ** trên gọi lại. –
Vui lòng xem câu trả lời của tôi để được giải thích lý do tại sao điều này xảy ra – 3dd