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.
FirstUserSession fait-il partie de l'assembly partagé ou uniquement de la classe de base? – Alex
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