Я довольно новичок в wcf и пытаюсь получить расширение wcf для регистрации, поэтому могу ультимативно открывать / закрывать сеанс NHibernate.
Однако я следовал за подробностями в Блог Адама Матусиакса1004 *.Я должен был сделать несколько предположений, поскольку это не компилировалось в первый раз.(NHibernateEndpointExtension: IExtension, это наследование не имеет типа в примере).Это просто не зарегистрирует расширение.Когда я делаю вызов wcf, он не имеет расширений в коллекции.
Нет сообщений об ошибках, и я не вижу ничего в журналах, которые я вижу
Кто-нибудь знает, где я могу посмотреть на некоторые записи или что-то в этом роде. Мой web.config выглядит следующим образом
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="NHibernateExtension" type="SMS.Infrastructure.NHibernateEndpointExtension, SMS.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<bindings>
<basicHttpBinding>
<binding name="AmjBasicHttpEndpointBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="AmjWsBinding">
<security>
<transport proxyCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="SMS.Services.BEIMBehavior">
<serviceMetadata httpGetEnabled="true" />
<!-- set thsi to false if you dont want helpfult stack traces-->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="SMS.Services.BEIMBehavior" name="SMS.Services.BEIM">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="AmjWsBinding"
name="BeimServices" contract="SMS.Services.IBEIM">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
Классы, которые я использую, следующие: на данный момент я избавился от вещей nhibernate, поскольку могу справиться с этим, когда расширение зарегистрировано
namespace SMS.Infrastructure
{
public class NHibernateEndpointExtension : IExtension<OperationContext>
{
public NHibernateEndpointExtension()
{
}
public NHibernate.ISession NHibernateSession{ get; set; }
public void Attach(OperationContext owner)
{
}
public void Detach(OperationContext owner)
{
}
}
public class NHibernateEndpointContextInitializer : ICallContextInitializer
{
public object BeforeInvoke(InstanceContext instanceContext, IClientChannel channel, Message message)
{
bool found = false;
foreach (IExtension<OperationContext> extension in OperationContext.Current.Extensions)
{
if (extension is NHibernateEndpointExtension)
{
found = true;
break;
}
}
if (!found)
{
OperationContext.Current.Extensions.Add(new NHibernateEndpointExtension());
}
return NHibernateWcfSessionProvider.Instance.OpenSession();
}
public void AfterInvoke(object correlationState)
{
NHibernateWcfSessionProvider.Instance.CloseSession(((NHibernate.ISession)correlationState));
((IDisposable)correlationState).Dispose();
}
}
public class NHibernateEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
public override Type BehaviorType
{
get { return typeof(NHibernateEndpointBehavior); }
}
protected override object CreateBehavior()
{
return new NHibernateEndpointBehavior();
}
public void Validate(ServiceEndpoint endpoint)
{
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher)
{
foreach (DispatchOperation operation in endpointDispatcher.DispatchRuntime.Operations)
{
operation.CallContextInitializers.Add(new NHibernateEndpointContextInitializer());
}
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
}
public class NHibernateWcfSessionProvider
{
public NHibernateWcfSessionProvider()
{
}
private static NHibernateWcfSessionProvider instance;
public static NHibernateWcfSessionProvider Instance
{
get
{
if (instance == null)
{
instance = new NHibernateWcfSessionProvider();
}
return instance;
}
}
private ISessionFactory sessionFactory;
public void CreateSessionFactory()
{
sessionFactory= NHibernateHelper.CreateSessionFactory();
}
public NHibernate.ISession GetSession()
{
// get Nhibernate session from OperationContext or HttpContext
return ISession // just here to show that a session will be returned
}
public NHibernate.ISession OpenSession()
{
// get Nhibernate session from OperationContext or HttpContext
return ISession // just here to show that a session will be returned
}
public void CloseSession()
{
CloseSession(null);
}
public void CloseSession(NHibernate.ISession session)
{
///Closes NHibernate session cleanly
}
}