Невозможно найти сборку, C # - PullRequest
1 голос
/ 10 июня 2010

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

Теперь я попытался сделать следующее: если вы хотите перейти в другое приложение, оно может посмотреть сеанс (все они используют один и тот же ключ сеанса) и обработать существующий объект как базовый из библиотеки 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

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2010

существующее - не базовая пользовательская сессия, это первая пользовательская оценка как базовая пользовательская сессия. Как таковой он может быть потенциально возвращен к первому использованию, которое существует только в сборке mycbc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...