Current.SessionID转换为Guid

时间:2015-04-17 07:58:08

标签: c# asp.net-mvc guid sessionid

我需要根据CurrentContext的SessionID创建Guid。 Guid存储在一些TraceContext类中,稍后会记录到DB中。

现在我使用Guid.NewGuid()创建新的guid,但我想基于sessionId创建guid。

我试过解析它:

var sessionId = HttpContext.Session.SessionId;
var result = Guid.Parse(sessionId);

问题是SessionId是24个字符串,例如:    的 jeycop2ty20icvuvh2jks20g 并且Guid必须是32个字符长,所以我得到Parse异常。

有没有办法从这个字符串创建Guid?

2 个答案:

答案 0 :(得分:4)

GUID[G]lobally [U]nique [ID]entifier,它不是哈希算法。

如果您希望将会话ID映射到GUID,则必须创建映射表或类似表。

或者您可以考虑在首次创建会话时在会话中存储GUID。

// Global.asax
public void Session_OnStart()
{
  Session["GUIDSessionID"] = Guid.NewGuid().ToString();
}

然后在每次加载页面时读取它。

var sessionId = HttpContext.Current.Session["GUIDSessionID"];
var result = Guid.Parse(sessionId);

这可以在没有的情况下完成,从字符串中来回转换。

答案 1 :(得分:4)

这两种解决方案都是hackish,您应该考虑不使用Guid或在会话中添加一个(请参阅André的解决方案)。

解决方案1 ​​

您可以覆盖SessionIdManager以提供Guid作为SessionId

请参阅SessionIDManager.CreateSessionID MethodSession Identifiers documentation (Custom Session Identifiers)

来自MDSN图书馆的代码:

自定义SessionIDManager类

  public class GuidSessionIDManager : SessionIDManager
  {

    public override string CreateSessionID(HttpContext context)
    {
      return Guid.NewGuid().ToString();
    }


    public override bool Validate(string id)
    {
      try
      {
        Guid testGuid = new Guid(id);

        if (id == testGuid.ToString())
          return true;
      }
      catch
      {
      }

      return false;
    }
  }

在web.config中注入它:

<sessionState
  ...
  sessionIDManagerType="Your.Namespace.GuidSessionIDManager, YourAssemblyName"
/>

解决方案2

default implementation of SessionIdManager构建一个15字节的数组来生成一个字符串。 Guid是16字节,因此您可以将字符串解码为15字节数组,然后从中构建Guid,其中0作为最后一个字节。实施可能会在未来版本中发生变化。