从 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();
...
}