c# - 从 WCF 服务调用实体框架数据库上下文
问题描述
我们使用 Repository 模式开发了一个 ASP Net MVC 应用程序。我们正在使用上下文提供程序类创建一个数据库上下文实例,例如:
public class ContextProvider
public static DBEntities GetContext()
{
return HttpContext.Current.Items["_EntityContext"] as DBEntities;
}
}
在这里,我们确保 DBEntities db 调用仅在请求存在期间存在 - 我们将实例放入 Session 映射中 -HttpContext.Current.Items["_EntityContext"]
在此示例中。
我们在整个 Asp Net Mvc 项目中使用它,如下所示:
public class TeamRepository
{
#region Members
private DBEntities storeDB = null;
#endregion Members
#region Constructors
public TeamRepository()
{
storeDB = ContextProvider.GetContext();
}
#endregion Constructors
#region Methods
...
现在我们需要创建一个 WCF 服务来允许其他供应商访问某些功能。
由于所有 Repository 类都是项目的一部分 - 它们没有被排除在单独的 DLL 中,因此我在新的 WCF 项目中引用了整个项目,以便我可以使用现有的 DB Repository 方法调用。
在这里我面临一个问题,因为我无法访问 Session 变量HttpContext.Current.Items["_EntityContext"]
- 从 WCF 服务调用时,方法调用公共静态 DBEntitiesGetContext()
总是返回 null。
我试图HttpContext.Current
通过放置在 WCF 服务中可用
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
在我的服务类上,并调整 web.config 的 serviceHostingEnvironment 部分,现在看起来像这样:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://localhost” />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
但没有结果。
我正在使用 Windows 10。
你知道我可以HttpContext.Current.Items["_EntityContext"]
从我的 WCF 项目中访问...包含在 Asp Net Mvc 项目中的方法吗?
问候
解决方案
使用以下步骤解决了该问题:我使用 AspNetCompatibilityRequirements 属性修饰了我的服务实现:
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
. . .
}
我必须做的最后一件事是 WCF 不支持多个主机标头;我不得不硬连线 WCF 端点来监听特定的主机名。在这种情况下,这涉及调整 web.config 的 serviceHostingEnvironment 部分,现在看起来像这样:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix=http://services.mydomain.com” />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
然后向服务实现类添加另一个属性并初始化 HttpContext.Current.Items 会话:
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
HttpContext.Current.Items["_EntityContext"] = new DBEntities();
...
}
推荐阅读
- flutter - Riverpod 条件提供程序状态更新
- android - 从 ViewModel 向 ViewPager2 的 Adapter 发送实时数据
- javascript - 未处理的拒绝(TypeError):observer.complete.bind 不是函数
- anylogic - AnyLogic 中的意外行为 SelectOutput 块
- javascript - 将“未定义”转换为未定义 - JavaScript
- c++ - CLion 不会使用地址清理程序运行二进制文件
- c# - C# - 如何从字典创建数据表?
- java - Integer input not accepting two digit string - boolean not validing it
- c - Windows GUI 应用程序中的每个函数都需要使用 stdcall 吗?
- python - Python列表:如何使其排序并消除重复项