首页 > 解决方案 > 从 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 项目中的方法吗?

问候

标签: c#asp.net-mvcwcf

解决方案


使用以下步骤解决了该问题:我使用 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();
...
}

推荐阅读