2010-06-10 4 views
1

Итак, вот сделка. У меня есть два приложения ASP.NET, оба из которых используют управление сеансом SQLServer Session. Они также используют один и тот же сервер. У меня есть пользовательский класс сеанса во внешней DLL, который полностью реализует сериализацию и на которую ссылаются оба приложения. Каждое приложение, в свою очередь, имеет класс, который наследуется от класса DLL, и оба приложения используют свои собственные соответствующие классы для своего состояния сеанса.Невозможно найти сборку, C#

Теперь, что я пытался сделать, было то, что если вы хотите перейти к другому приложению, он может посмотреть в сеансе (все они используют один и тот же ключ сеанса) и обрабатывать существующий объект там как базу (один из DLL), извлеките необходимую информацию для входа, а затем перезапишите объект сеанса своим. К сожалению, когда второе приложение пытается прочитать сеанс, кажется, что он ищет DLL первого приложения, и когда он не может его найти, он выдает исключение.

Есть ли недостаток в моей логике?

Вот пример:

// Global.asax of the 1st app 
protected void Session_Start(object sender, EventArgs e) 
{ 
    Session.Add( 
     "UserSessionKey", 
     new FirstUserSession()); // FirstUserSession inherits from BaseUserSession 
} 

Теперь второе приложение:

// Global.asax of 2nd app 
protected void Session_Start(object sender, EventArgs e) 
{ 
    if (Session["UserSessionKey"] != null) 
    { 
     BaseUserSession existing = (BaseUserSession)Session["UserSessionKey"]; 

     SecondUserSession session = new SecondUserSession(); // This also inherits from BaseUserSession 

     session.Authenticated = existing.Authenticated; 
     session.Id = existing.Id; 
     session.Role = existing.Role; 

     Session.Add("UserSessionKey", session); 
    } 
    else 
    { 
     Session.Add("UserSessionKey", new SecondUserSession()); 
    } 
} 

Вот стека исключений трассировки. В этом случае «MyCBC» является настоящим именем первого приложения, а «ASPTesting» - это второе приложение.

[SerializationException: Unable to find assembly 'MyCBC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.] 
    System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() +1871092 
    System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name) +7545734 
    System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) +120 
    System.Runtime.Serialization.Formatters.Binary.ObjectMap.Create(String name, String[] memberNames, BinaryTypeEnum[] binaryTypeEnumA, Object[] typeInformationA, Int32[] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) +52 
    System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record) +190 
    System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum) +61 
    System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() +253 
    System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +168 
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +203 
    System.Web.Util.AltSerialization.ReadValueFromStream(BinaryReader reader) +788 
    System.Web.SessionState.SessionStateItemCollection.ReadValueFromStreamWithAssert() +55 
    System.Web.SessionState.SessionStateItemCollection.DeserializeItem(String name, Boolean check) +281 
    System.Web.SessionState.SessionStateItemCollection.get_Item(String name) +19 
    System.Web.SessionState.HttpSessionStateContainer.get_Item(String name) +13 
    System.Web.SessionState.HttpSessionState.get_Item(String name) +13 
    ASPTesting._Default.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\sarsstu\My Documents\Projects\Testing\ASPTesting\ASPTesting\Default.aspx.cs:20 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
    System.Web.UI.Control.OnLoad(EventArgs e) +99 
    System.Web.UI.Control.LoadRecursive() +50 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627 

Спасибо всем заблаговременно.

+0

Является ли FirstUserSession частью общей сборки или только базовым классом? – Alex

+0

FirstUserSession не является базовым классом, он является одним из полученных. Здесь в основном работают три сборки: общая DLL, которая содержит BaseUserSession, а затем две соответствующие сборки приложений, которые содержат FirstUserSession и SecondUserSession (оба из которых наследуются от BaseUserSession). – PlasmaCube

ответ

0

не существующее место baseusersession, это firstusersession отбрасывать как baseusersession. Таким образом, это может быть потенциально отброшено к firstusersession, которое существует только в сборке mycbc.

Смежные вопросы