首页 > 解决方案 > 如何使用 SessionId 获取会话?

问题描述

我使用 ASP.NET MVC。我有个问题。我将变量设置为会话,并请求不属于我的 Web 服务。然后 Web 服务HttpPost向我的服务器发出请求。它不会向我的服务器发送 cookie,所以我失去了会话。

我想我可以将我的数据保存sessionid到数据库中,然后我可以用这个 ID 恢复我的会话。但我无法得到任何解决方案。

你有什么建议?

public ActionResult SomeAction(){
    mySettingService.saveSessionIdToDb(someToken, Session.SessionID);

    var myPaymentFormObj = FormInit.Create(request, options);
    myPaymentFormObj.DoRequest(); //it's callback to my another action with a token
}


[HttpPost]
public ActionView MyCallBack(string someToken){
    //here is our app generates new session id and i lost my session because other server doesn't send me session id.
    //i need to read session id from db and i can get my session maybe.

    var mySessionId = mySettingService.getSessionIdFromDb(someToken);

    //how can i start session like this?
    Session.SessionID = mySessionId;
}

标签: c#asp.netasp.net-mvcsessiontransactions

解决方案


您描述的问题似乎与维护分布式事务有关。为了更好地描述它,您的应用程序是服务 A,而 webServer 是服务 B。您可以执行一个操作,将一些更改保存到数据库 A,包括会话内容,然后您向服务 B 发送调用,这也可以保存对其的一些更改数据库或执行一系列其他操作,但在这种情况下,您并不关心它是如何工作的,您只关心通过回调得到什么样的响应。应该有一个选项可以发送某种独特的东西,比如你可以在回调方法中取回userEmail的东西transactionId,以便能够识别交易。

我建议你做的是

[HttpPost]
public ActionResult SendBlah(BlahData data){
    var transactionId = Guid.NetGuid();
    _sessionService.Create(transactionId, dataYouWantToStore)
    _webServiceB.SendBlah(transactionId, data, token);
    //optionally return info about call status / do other stuff
}

//or this can be of type HttpGet
[HttpPost]
public ActionView MyCallBack(string someToken, string tranactionId){
    var sessionData = _sessionService.Get(tranactionId) 
    //do other stuff
}

如果需要它并且您正在使用例如JWT,您可以将其存储在transactionId/emailAddress/etc.那里并阅读它。顺便提一句。将会话存储在数据库中总是更安全,而不是使用一些缓存对象或中继 cookie 或 javascript 对象等。此外,最好小心要存储在数据库中的会话表中的数据量。我个人会专注于存储 ID 和给定项目的状态等内容。


推荐阅读