我需要根据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?
答案 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 Method和Session 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作为最后一个字节。实施可能会在未来版本中发生变化。