2015-04-17 3 views
-3

У меня есть требование создать Guid на основе SessionID из CurrentContext. Этот указатель хранится в некотором классе TraceContext, который позже регистрируется в БД.Current.SessionID convert to Guid

Теперь я использую Guid.NewGuid() для создания нового guid, но я хотел бы создать guid на основе sessionId.

Я попытался разбором его:

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

Проблема заключается в том, что SessionId является 24 символ строки, например: jeycop2ty20icvuvh2jks20g и Guid должен быть 32 гольца долго, так что я получаю Синтаксическую исключение.

Есть ли способ создать Guid из этой строки?

+3

_ «У меня есть требование создать Guid на основе SessionID из CurrentContext» _ - почему?Каковы причины этого? Должен ли он быть основан на _ или связан с? – CodeCaster

+1

Вы также получите исключение синтаксического анализа, потому что этот идентификатор сеанса содержит символы, которые являются незаконными в директиве, который обычно записывается шестнадцатеричным представлением 32 символа (плюс некоторые дефисы) из 128-битного числа, которое оно действительно есть. –

ответ

3

Оба решения являются хакерскими, и вы должны не учитывать использование принципа «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 байтов для генерации строки. Вы можете разбить строку на 15 байт, а затем построить указатель из него с 0 в качестве последнего байта. Реализация может измениться в будущей версии.

+0

Спасибо за такой подробный ответ, я буду считать это правильным ответом. Я вас всех понимаю, но я не могу изменить генерацию sessionID. Как насчет создания хеша MD5 из sessionId, а не преобразования его в Guid. Я написал этот код, и он работает, но я не знаю, будут какие-то последствия позже? – freshbm

+0

@freshbm Вы вводите риск сталкивающихся гидов: хэш MD5 разных идентификаторов сеансов может иметь одинаковое значение, и у вас будет один Guid, представляющий разные сессии! – Guillaume

+0

Это впечатляюще, спасибо. – jackmott

2

A GUID - [G]lobally [U]nique [ID]entifier, это не алгоритм хэширования.

Если вы хотите, чтобы идентификатор сеанса был сопоставлен с GUID, вам нужно будет создать таблицу сопоставления или аналогичную.

В качестве альтернативы вы можете рассмотреть, сохраняя GUID в сеансе, когда он впервые создан.

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

и последующее считывание каждой загрузки каждой страницы.

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

Это можно было бы сделать без преобразования, переведя его из строя.