gpt4 book ai didi

c# - WCF/S#arpArch : underlying ISession is closed after the first call within a request

转载 作者:行者123 更新时间:2023-11-30 21:22:16 24 4
gpt4 key购买 nike

我知道在 SA 中使用 WCF 已被弃用,因为它将移至 SA Contrib。但在它实现之前,我想我必须使用 SA 中的支持。

也就是说,在调用 WCF 服务后关闭底层 NHibernate session 时遇到问题。我的存储库的 DbContext.Session 在第一次调用后关闭,因此我不能在单个 HTTP 请求期间多次调用我的服务。

我已经根据 Northwind 示例应用程序在我的项目中设置了 WCF。该示例仅在每个请求中调用一次 WCF 服务,因此该问题不会出现在此处。这个问题很容易重现,方法是在领土 Controller :

territories = territoriesWcfService.GetTerritories();

这会抛出一个 ObjectDisposedException:“ session 已关闭!对象名称:“ISession”。

有什么想法吗?

最佳答案

我设法解决了它。

通过检查 SharpArch.Wcf 源代码,我发现在发送 WCF 服务响应之前,它总是关闭所有 NHibernate session 。这本身就是一件好事。

此外,我发现我的客户端代理工厂在每次 Web 请求时只触发一次,而第二次服务调用应该会引发一个新的代理实例。结果是第二次服务调用将失败,因为底层 NHibernate session 已经关闭。我通过使用 CaSTLe.Core.TransientAttribute 装饰我的客户端代理类解决了这个问题,这将生命周期管理留给了创建客户端的工厂。其结果是每次请求代理时我们的代理工厂都会被调用。

其次,我必须像这样注册代理(在 ComponentRegistrar 类中):

container.AddFacility("WcfSessionFacility", new WcfSessionFacility());

container.Kernel.AddComponentWithExtendedProperties(
"AccountService",
typeof(IAccountService),
typeof(AccountServiceClient),
new Dictionary<string, object>()
{
{ WcfSessionFacility.ManageWcfSessionsKey, true }
});

WcfSessionFacility 根据其状态管理客户端的关闭/中止。这确保了客户端 channel 在客户端代理被销毁时关闭,因此我们不需要将我们的调用放在 try-catch block 中。

像我一样,您可能会考虑在添加组件而不是使用属性时配置生命周期管理,但显然没有合适的 AddComponentWithExtendedProperties 重载允许这样做。

关于c# - WCF/S#arpArch : underlying ISession is closed after the first call within a request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com