Some more details here:
In Service.xml :
Code:
<object id="WcfOsiv" lazy-init="true" type="Spring.Data.NHibernate.Support.SessionScope,Spring.Data.NHibernate12" />
<object id="WcfNhLazy" lazy-init="true" type="Framework.Integration.WCF.NHibernate.HibernateDataContractSurrogate, Framework.Integration" />
<object id="WcfMsgLog" lazy-init="true" type="Framework.Integration.WCF.DispatchMessageInspector, Framework.Integration">
<constructor-arg name="osiv" ref="WcfOsiv"/>
</object>
So I inject OSIV in my every in/out message. and also replace default to HibernateDataContractSurrogate.
Framework.Integration.WCF.DispatchMessageInspector .cs
Code:
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
if (Osiv != null && !Osiv.IsOpen) Osiv.Open();
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
if (Osiv != null) Osiv.Close();
}
Framework.Integration.WCF.InterceptBehavior.cs
Code:
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
if (this.Enabled)
{
#region ICallContextInitializer
//IDictionary ctxs = ctx.GetObjectsOfType(typeof(ICallContextInitializer));
//foreach (DictionaryEntry de in ctxs)
//{
// //For all operations!
// foreach (DispatchOperation op in endpointDispatcher.DispatchRuntime.Operations)
// op.CallContextInitializers.Add((ICallContextInitializer)de.Value);
//}
#endregion
#region IDataContractSurrogate
IDictionary surs = ctx.GetObjectsOfType(typeof(IDataContractSurrogate));
foreach (DictionaryEntry de in surs)
{
//Register HibernateDataContractSurrogate for Lazy-Properties serialization
foreach (OperationDescription od in endpoint.Contract.Operations)
{
DataContractSerializerOperationBehavior dcsob =
od.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dcsob != null)
dcsob.DataContractSurrogate = (IDataContractSurrogate)de.Value;
}
}
#endregion
#region IDispatchMessageInspector
IDictionary msgs = ctx.GetObjectsOfType(typeof(IDispatchMessageInspector));
foreach (DictionaryEntry de in msgs)
{
endpointDispatcher.DispatchRuntime.MessageInspectors.Add((IDispatchMessageInspector)de.Value);
}
#endregion
}
}