Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WCF服务调用实体框架数据库上下文_C#_Asp.net Mvc_Wcf - Fatal编程技术网

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

C# 从WCF服务调用实体框架数据库上下文,c#,asp.net-mvc,wcf,C#,Asp.net Mvc,Wcf,我们使用存储库模式开发了一个ASP Net MVC应用程序。 我们正在使用上下文提供程序类创建db上下文实例,如: public class ContextProvider public static DBEntities GetContext() { return HttpContext.Current.Items["_EntityContext"] as DBEntities; } } 在这里,我们确保DBE

我们使用存储库模式开发了一个ASP Net MVC应用程序。 我们正在使用上下文提供程序类创建db上下文实例,如:

public class ContextProvider

        public static DBEntities GetContext()
        {
            return HttpContext.Current.Items["_EntityContext"] as DBEntities;
        }
    }
在这里,我们确保DBEntities db调用仅在请求存在期间存在-我们将实例放入会话映射中-
HttpContext.Current.Items[“\u 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项目中引用了整个项目,以便可以使用现有的DB存储库方法调用

这里我面临一个问题,因为我无法访问会话变量
HttpContext.Current.Items[“\u EntityContext”]
-方法调用public static DBEntities
GetContext()
在从WCF服务调用时总是返回null

我试图通过放置

[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)] 
在我的服务课上, 调整web.config的serviceHostingEnvironment部分,该部分现在如下所示:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix="http://localhost” />
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix=http://services.mydomain.com” />
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>


通过以下步骤解决此问题: 我用AspNetCompatibilityRequirements属性修饰了我的服务实现:

[AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
public class Service : IService {
   . . .
}
我必须做的最后一件事是WCF不支持多个主机头;我必须硬连线WCF端点以监听特定的主机名。在本例中,这涉及调整web.config的serviceHostingEnvironment部分,该部分现在如下所示:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix="http://localhost” />
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix=http://services.mydomain.com” />
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

架构上的答案是使用依赖注入,从而删除存储库中的所有http.*类型引用。WCF中没有HTTPContext,WCF会话与http会话不同。官方解释。以下是一些相关的讨论。你有这篇文章,给出了一些如何使用它的说明:-这里说它可以被访问…这里,也说它可以被使用