【发布时间】:2023-04-05 22:48:01
【问题描述】:
我们使用存储库模式开发了一个 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 服务调用时,方法调用 public static DBEntities GetContext() 总是返回 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。
您知道我可以从我的 WCF 项目访问 Asp Net Mvc 项目中包含的HttpContext.Current.Items["_EntityContext"]... 的方法吗?
问候
【问题讨论】:
-
架构答案是使用依赖注入,从而删除存储库中的任何 http.* 类型引用。
-
WCF 中没有 HTTPContext,WCF 会话不同于 HTTP 会话。官方解释。 docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/… 这里有一些相关的讨论。 stackoverflow.com/questions/59637749/…stackoverflow.com/questions/5990479/httpcontext-in-wcf
-
你有这篇文章给出了如何使用它的一些说明:dylanbeattie.net/2011/02/24/… - 这表示它可以访问......
标签: c# asp.net-mvc wcf