I am getting the error "Value cannot be null.\r\nParameter name: key" upon deserializing my remoted object. From the stack trace it looks like it trying to get a reference to session factory. I don't understand that because I use the session factory, session and criteria only temporarily on a server side method of the class. I'm just returning the IList of results to the client, it shouldn't be trying to send over server side objects. Any ideas as to the problem? Thanks
Error:System.ArgumentNullException occurred
Message="
Value cannot be null.\r\nParameter name: key"
Source="mscorlib"
ParamName="key"
StackTrace:
Server stack trace:
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at NHibernate.Impl.SessionFactoryObjectFactory.GetNamedInstance(String name)
at NHibernate.Impl.SessionFactoryImpl.GetRealObject(StreamingContext context)
at System.Runtime.Serialization.ObjectManager.ResolveObjectReference(ObjectHolder holder)
at System.Runtime.Serialization.ObjectManager.DoFixups()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Remoting.Channels.CoreChannel.DeserializeBinaryResponseMessage(Stream inputStream, IMethodCallMessage reqMsg, Boolean bStrictBinding)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.DeserializeMessage(IMethodCallMessage mcm, ITransportHeaders headers, Stream stream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at TH.Common.Remoting.DataServer.Execute(ExecutableBase executableObject)
at TH.Common.Business.ExecutableBase.Execute() in C:\Source\TH.Common\Falanouc\Business\ExecutableBase.cs:line 19
InnerException:
NHibernate Base class:Code:
[Serializable]
public abstract class NHibernateExecutableBase : NonDataExecutableBase
{
public override ExecutableBase ServerExecute()
{
//var sessionFactory = SessionManager.Instance.SessionFactory;
using (var sessionFactory = SessionFactory.CreateSessionFactory())
{
using (var session = sessionFactory.OpenSession())
{
var transaction = session.BeginTransaction();
try
{
ServerExecute(session);
}
catch (Exception)
{
transaction.Rollback();
throw;
}
transaction.Commit();
}
}
return this;
}
public virtual void ServerExecute(
ISession session)
{
throw new NotImplementedException("Must be overriden in derived class");
}
}
Criteria Class:Code:
[Serializable]
public class NHibernateCriteriaExecutable<TPoco> : NHibernateExecutableBase
{
public DetachedCriteria Criteria { get; set; }
public IList<TPoco> Results { get; private set; }
public override void ServerExecute(ISession session)
{
var serverSideCriteria = Criteria.GetExecutableCriteria(session);
this.Results = serverSideCriteria.List<TPoco>();
}
public static IList<TPoco> Process(DetachedCriteria criteria)
{
var eo = new NHibernateCriteriaExecutable<TPoco> {Criteria = criteria};
eo = (NHibernateCriteriaExecutable<TPoco>) eo.Execute();
return eo.Results;
}
}
Partial calling code:Code:
var query = DetachedCriteria.For<ProviderTrainingSearchResult>();
if (null != phyID)
query.Add(Expression.Eq("PHY_ID", phyID.Value));
var results = NHibernateCriteriaExecutable<ProviderTrainingSearchResult>.Process(
query);
Debug.WriteLine(results.Count);