C# 从WCF服务调用实体框架数据库上下文
我们使用存储库模式开发了一个ASP Net MVC应用程序。 我们正在使用上下文提供程序类创建db上下文实例,如: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
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 DBEntitiesGetContext()
在从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会话不同。官方解释。以下是一些相关的讨论。你有这篇文章,给出了一些如何使用它的说明:-这里说它可以被访问…这里,也说它可以被使用