从WCF服务调用实体框架数据库上下文

时间:2020-01-08 15:51:57

标签: c# asp.net-mvc wcf

我们已经使用存储库模式开发了ASP Net MVC应用程序。 我们正在使用诸如以下内容的上下文提供程序类来创建数据库上下文实例:

public class ContextProvider

        public static DBEntities GetContext()
        {
            return HttpContext.Current.Items["_EntityContext"] as DBEntities;
        }
    }

在这里,我们确保DBEntities db调用仅在请求存在期间存在-我们将实例放入会话映射-在此示例中为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服务,以允许其他供应商访问某些功能。

由于所有存储库类都是项目的一部分-不会将它们排除在单独的DLL中,因此我在新的WCF项目中引用了整个项目,以便可以使用现有的数据库存储库方法调用。

由于无法访问Session变量HttpContext.Current.Items["_EntityContext"],这里遇到了一个问题-从WCF服务调用时,方法调用公共静态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"] ...吗?

致谢

1 个答案:

答案 0 :(得分:0)

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