EF6和azure worker角色:底层提供者在打开时失败

本文关键字:提供者 失败 azure worker 角色 EF6 | 更新日期: 2023-09-27 18:07:52

我正在努力与EntityFramework 6和PaaS架构。我有一个存储库项目,它调用一个DAL项目来执行一些EF6导入的存储过程。直到最近,我们还在使用IaaS架构,但由于某些原因,我们转向了PaaS。WCF服务成功地使用了同一个存储库。这个WCF服务已经转换为Web角色,工作起来非常出色。现在,我在Worker Role中使用相同的存储库来解除服务总线的队列并处理数据(由Web Role加入队列)。但后来我得到了错误,而使用存储库在我第一次调用通过EF6存储过程(Get请求)

Schedule worker error with inner exception : A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) The underlying provider failed on Open. 
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection()
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass45`1.b__43()
at System.Data.Entity.Infrastructure.DbExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction[TElement](String functionName, ExecutionOptions executionOptions, ObjectParameter[] parameters)
at XXX.DBContext.XXXEntities.GetTrades(Nullable`1 id, Nullable`1 entityBuy, Nullable`1 entitySell, Nullable`1 sessionId, Nullable`1 orderBuy, Nullable`1 orderSell)
at XXX.RepositoryServices.MarketPlaceService.GetTradeInstances(Nullable`1 EntityBuy, Nullable`1 EntitySell, Nullable`1 SessionId, Nullable`1 OrderBuyId, Nullable`1 OrderSellId)
at WorkerRole1.WorkerRole.Run()

(XXX和YYY是名称空间,但由于策略原因我不能显示它们)我试图为数据库上的azure(托管在IaaS中)设置防火墙例外,用于IP从0.0.0.0到0.0.0.4。我添加了一个从DbConfiguration继承的配置类,它在

中配置如下:
this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
:new System.Data.Entity.SqlServer.SqlAzureExecutionStrategy(5,TimeSpan.FromMilliseconds(25)));

(using SuspendExecutionStrategy = true)我确保了EntityFramework和EntityFramework。将对应版本的SqlServer dll拷贝到cspkg文件中。

我的连接字符串也很好(里面有凭据)。我确信最后一部分,因为我可以成功地使用ADO。在我的工作角色Run方法以及使用此存储库的类中使用。NET sql查询。我尝试了最新版本的EF6(即。6.1),但不管用。我试图把我的工作人员在同一子网的web角色(不工作)。我试图在连接字符串中使用SqlServer的IP地址,但没有工作。ADO也使用相同的连接字符串。. NET和EF6.

    <add name="XXXEntities" connectionString="metadata=res://*/XXXContext.csdl|res://*/XXXContext.ssdl|res://*/XXXConte xt.msl;provider=System.Data.SqlClient;provider connection string=&quot;data  source=negobdd1.YYY.com;initial catalog=XXX;user id=[User];password= [Password];MultipleActiveResultSets=True;App=EntityFramework&quot;"  providerName="System.Data.EntityClient" />
很抱歉有这么多繁文缛节,但这是客户的要求。所有的XXX都是完全相同的字符串)我试图从托管worker角色的azure VM机器连接到使用地址"negobdd1.YYY.com"和连接字符串的用户和密码的.udl文件连接到db。我可以ping SqlServer机器也成功。

编辑

上下文是这样创建的

    public partial class NegotiationsPlatformEntities : DbContext
    {
        public NegotiationsPlatformEntities()
        : base("name=NegotiationsPlatformEntities")
        {
        }
    // auto-generated methods here
    }

的实例化

     internal NegotiationsPlatform.DBContext.NegotiationsPlatformEntities db = new NegotiationsPlatform.DBContext.NegotiationsPlatformEntities();

我不设置任何特殊参数,除了连接字符串的名称。

改订

查看DbContext.Database.Connection.Datasource后,我发现EF6显然是针对本地staging db服务器,而不是Azure IaaS SqlServer。我去调查一下,然后回复你。

任何帮助都将是非常感激的。

谢谢。

EF6和azure worker角色:底层提供者在打开时失败

事实证明,worker角色不像web角色那样处理连接字符串文件。因为有多个部署环境,我们有多个名为"connectionStrings"+ [target] +"的文件。配置"。

在web角色的OnStart方法中,我们使用.bat文件删除任何不必要的配置文件,并将所需的文件重命名为"connectionStrings.config"。这样,在部署在Azure上的web浏览器中,它只保留PaaS配置文件,然后使用它。但很明显,这在工人角色中不起作用。

清理"。bat"文件被执行,只留下一个具有正确内容的配置文件,但使用的是默认配置文件中的内容。所以我猜工人加载配置文件之前,它调用OnStart方法,因此任何变化都不重要。(我没有试图杀死工作进程,看看重启后它是否加载了第一次部署留下的唯一好的文件)

所以这是我的解决方案:删除除PaaS之外的所有工作项目中的配置文件,不要依赖于OnStart期间使用的"。bat"文件。

非常感谢Dean Ward把我带到了正确的道路上。总之,它"只是"一个连接字符串的问题。