【问题标题】:Calling Entity Framework db context from WCF Service从 WCF 服务调用实体框架数据库上下文
【发布时间】: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"]... 的方法吗?

问候

【问题讨论】:

标签: c# asp.net-mvc wcf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多