从 WCF 服务调用 Entity Framework 数据库上下文
Calling Entity Framework db context from WCF Service
我们使用存储库模式开发了一个 ASP Net MVC 应用程序。
我们正在使用上下文提供程序 class 创建数据库上下文实例,例如:
public class ContextProvider
public static DBEntities GetContext()
{
return HttpContext.Current.Items["_EntityContext"] as DBEntities;
}
}
这里我们确保 DEBentities 数据库调用仅在请求存在期间存在 - 我们将一个实例放入会话映射 - 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 服务来允许其他供应商访问某些功能。
因为所有存储库 classes 都是项目的一部分 - 它们没有被排除在单独的 DLL 之外,所以我在我的新 WCF 项目中引用了整个项目,这样我就可以使用已经存在的数据库存储库方法调用。
这里我遇到了一个问题,因为我无法访问 Session 变量 HttpContext.Current.Items["_EntityContext"]
- 方法调用 public 静态 DBEntities GetContext()
从 WCF 调用时总是返回 null服务。
我试图通过放置
使 HttpContext.Current
在 WCF 服务中可用
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
我的服务class,
并调整 web.config 的 serviceHostingEnvironment 部分,现在看起来像这样:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://localhost” />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
但没有结果。
我正在使用 Windows 10.
你知道我可以从我的 WCF 项目访问 HttpContext.Current.Items["_EntityContext"]
... 包含在 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>
然后向服务实现添加另一个属性 class 并初始化 HttpContext.Current.Items 会话:
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
HttpContext.Current.Items["_EntityContext"] = new DBEntities();
...
}
我们使用存储库模式开发了一个 ASP Net MVC 应用程序。 我们正在使用上下文提供程序 class 创建数据库上下文实例,例如:
public class ContextProvider
public static DBEntities GetContext()
{
return HttpContext.Current.Items["_EntityContext"] as DBEntities;
}
}
这里我们确保 DEBentities 数据库调用仅在请求存在期间存在 - 我们将一个实例放入会话映射 - 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 服务来允许其他供应商访问某些功能。
因为所有存储库 classes 都是项目的一部分 - 它们没有被排除在单独的 DLL 之外,所以我在我的新 WCF 项目中引用了整个项目,这样我就可以使用已经存在的数据库存储库方法调用。
这里我遇到了一个问题,因为我无法访问 Session 变量 HttpContext.Current.Items["_EntityContext"]
- 方法调用 public 静态 DBEntities GetContext()
从 WCF 调用时总是返回 null服务。
我试图通过放置
使HttpContext.Current
在 WCF 服务中可用
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
我的服务class, 并调整 web.config 的 serviceHostingEnvironment 部分,现在看起来像这样:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://localhost” />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
但没有结果。
我正在使用 Windows 10.
你知道我可以从我的 WCF 项目访问 HttpContext.Current.Items["_EntityContext"]
... 包含在 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>
然后向服务实现添加另一个属性 class 并初始化 HttpContext.Current.Items 会话:
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
HttpContext.Current.Items["_EntityContext"] = new DBEntities();
...
}