2010-06-10 7 views
1

Alors, voici l'affaire. J'ai deux applications ASP.NET, qui utilisent SQLServer Session State Management. Ils utilisent tous les deux le même serveur. J'ai une classe de session personnalisée dans une DLL externe, qui implémente complètement la sérialisation, et que les deux applications ont référencée. Chaque application, à son tour, a une classe qui hérite de la classe DLL, et les deux applications utilisent leurs propres classes respectives pour leur état de session. Maintenant, ce que j'essayais d'accomplir était que si vous vouliez aller à l'autre application, il pourrait regarder dans la session (ils utilisent tous la même clé de session) et traiter l'objet existant là comme la base (le un de la DLL), extrayez les informations de connexion dont vous avez besoin, puis remplacez l'objet session par le vôtre. Malheureusement, lorsque la deuxième application tente de lire la session, il semble qu'elle recherche la DLL de la première application, et lorsqu'elle ne la trouve pas, elle lève une exception.Impossible de trouver l'assemblage, C#

Y a-t-il une faille dans ma logique?

Voici un exemple:

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

Maintenant, la deuxième application:

// 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()); 
    } 
} 

Voici la trace de la pile d'exception. Dans ce cas, "MyCBC" est le vrai nom de la première application, et "ASPTesting" est la deuxième application.

[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 

Merci à tout le monde à l'avance.

+0

FirstUserSession fait-il partie de l'assembly partagé ou uniquement de la classe de base? – Alex

+0

FirstUserSession n'est pas la classe de base, c'est l'un des dérivés. Il existe essentiellement trois assemblys à l'œuvre ici: la DLL partagée, qui contient BaseUserSession, puis les deux assemblys d'application respectifs qui contiennent FirstUserSession et SecondUserSession (tous deux qui héritent de BaseUserSession). – PlasmaCube

Répondre

0

exisiting est pas un baseusersession, il est un firstusersession jeté comme baseusersession. En tant que tel, il pourrait être potentiellement renvoyé à une première session, qui n'existe que dans l'assemblage mycbc.

Questions connexes