无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码

Posted

技术标签:

【中文标题】无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码【英文标题】:Unable to connect to Azure Cosmos Db Account using Microsoft.EntityFrameworkCore.Cosmos - Response status code 【发布时间】:2020-02-20 21:51:19 【问题描述】:

CosmosDb 提供商正在发送此消息:

“响应状态码不表示成功:503 子状态:0 原因:(请求失败,因为客户端无法跨 1 个区域建立与 3 个端点的连接。请检查客户端资源不足问题并验证连接性客户端和服务器之间。”

在我的测试中,它可以工作(.net core 3.1):

Task.Run(async () =>
        
            var endpoint = “test”;
            var masterKey = “test”;
            using (var client = new DocumentClient(new Uri(endpoint), masterKey))
            
                //Insert new Document  
                Console.WriteLine("\r\n>>>>>>>>>>>>>>>> Creating Document <<<<<<<<<<<<<<<<<<<");
                dynamic candidato = new
                
                    Id = 1,
                    Nome = "Test"
                ;

                var document1 = await client.CreateDocumentAsync(
                    UriFactory.CreateDocumentCollectionUri("Test", "Test"),
                    candidato);

                Console.ReadKey();
            

        ).Wait();

它没有:

            Task.Run(async () =>
            
                using (var context = new StudentsDbContext())
                
                    context.Add(new FamilyContainer(2, "Test"));
                    await context.SaveChangesAsync();
                

            ).Wait();

public class FamilyContainer

    public int Id  get; set; 
    public string Nome  get; set; 

    public FamilyContainer(int id, string nome)
    
        Id = id;
        Nome = nome;
    



public class StudentsDbContext : DbContext

    public DbSet<FamilyContainer> FamilyContainer  get; set; 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        optionsBuilder.UseCosmos(
           "test",
           "test",
           "FamilyDatabase",
           options =>
            
         );
    

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity<FamilyContainer>(x =>
        
            x.ToContainer("FamilyContainer");
        );
    

Packages

谁能帮帮我?谢谢

失败:Microsoft.EntityFrameworkCore.Update[10000] 保存上下文类型“...”的更改时,数据库中发生异常。 Microsoft.EntityFrameworkCore.Storage.RetryLimitExceededException:使用“CosmosExecutionStrategy”执行数据库操作时超出最大重试次数 (6)。有关最近的失败,请参阅内部异常。 ---> Microsoft.Azure.Cosmos.CosmosException :响应状态码不表示成功:503 子状态:0 原因:(Microsoft.Azure.Documents.ServiceUnavailableException:服务当前不可用。ActivityId:07fbf539-0d44-4e5a-89d0- cd46838ee605, "RequestStartTimeUtc":"2020-02-21T16:34:09.1834993Z","RequestEndTimeUtc":"2020-02-21T16:34:41.3484203Z","RequestLatency":"00:00:32.1649210"," IsCpuOverloaded":false,"NumberRegionsAttempted":1,"ResponseStatisticsList":["ResponseTime":"2020-02-21T16:34:11.5964152Z","ResourceType":2,"OperationType":0,"StoreResult": “StorePhysicalAddress:rntbd:.../,LSN:-1,GlobalCommittedLsn:-1,PartitionKeyRangeId:,IsValid:True,StatusCode:410,SubStatusCode:0,RequestCharge:0,ItemLSN:-1,SessionToken:,UsingLocalLSN:False ,TransportException:发生客户端传输错误:无法连接到远程端点。(时间:2020-02-21T16:34:11.5298608Z,活动ID:07fbf539-0d44-4e5a-89d0-cd46838ee605,错误代码:ConnectFailed [0x0005 ],基本错误:套接字错误 ConnectionRefused [0x0000274D]... --- 内部异常堆栈跟踪结束 ---

【问题讨论】:

请添加整个异常堆栈跟踪和信息 谢谢@MatiasQuaranta,现在我把exeption。 【参考方案1】:

我也遇到了同样的问题。

对我有用的是在初始化CosmosClient 时将ConnectionMode 更改为ConnectionMode.Gateway,例如:

var options = new CosmosClientOptions()  ConnectionMode = ConnectionMode.Gateway ;
var client = new CosmosClient(endpoint, key, options); 

更多详情请参考:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.cosmosclientoptions?view=azure-dotnet

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.connectionmode?view=azure-dotnet

【讨论】:

在我的情况下,我在代理后面运行软件,ConnectionMode = ConnectionMode.Gateway 成功了?【参考方案2】:

TransportException:发生客户端传输错误:无法连接到远程端点。 (时间:2020-02-21T16:34:11.5298608Z,活动 ID:07fbf539-0d44-4e5a-89d0-cd46838ee605,错误代码:ConnectFailed [0x0005],基本错误:套接字错误 ConnectionRefused

这意味着连接被拒绝。

您的 Cosmos DB 帐户启用了防火墙/***,并且由于不在白名单 IP/网络中,应用程序无法建立连接:请尝试检查您的帐户配置。 您正在执行代码的环境正在限制连接(某些公司防火墙或网络可能会阻止端口范围):尝试在不同的网络中运行应用程序,或使用GatewayMode。如果可行,那么这与网络有关。 计算机可能在套接字上运行不足或 CPU 上运行过高。

【讨论】:

感谢 Matias,问题出在公司防火墙上。我公司的基础设施解放了一些 IP 范围并且运行良好。 @LuisAugustoBarbosa 很高兴听到这个消息,请标记答案以帮助遇到相同问题的其他人。 不错,但是网关模式有点慢,请查看:docs.microsoft.com/en-us/azure/cosmos-db/… @ShaijuT 是的,Gateway 并不是为了提高性能,因为它增加了一个额外的网络跃点,但在某些情况下可能需要它。例如,无法打开 TCP 所需的所有端口的公司。我提到网关只是为了以防万一它适合场景,它只是潜在的选择之一。您还可以使用 TCP 并打开所有记录在案的端口。【参考方案3】:

我的 RCA 是:Cosmos 分区由 CosmosDB 上的各个进程提供服务,每个分区服务进程都有自己的 TCP 端口。当客户端连接到 443(使用 TCP 直接模式)时,CosmosDB 代理将分区端口发送回客户端,以便客户端可以与服务器分区并行通信。分区端口是随机的(11000 向上 afaik)。正常的公司防火墙将允许出站 443(连接到 cosmos 有效),但会阻止出站随机端口。所以最后,访问失败。 解决方法:

    打开防火墙 使用网关模式。这仅通过内部转发而不是重定向到其他端口来使用 https/443。

【讨论】:

【参考方案4】:

这是因为Entity框架默认的连接方式是Direct。在将其覆盖到网关后它对我有用。

    
        optionsBuilder.UseCosmos(
           "test",
           "test",
           "FamilyDatabase",
           options =>
            options.ConnectionMode(ConnectionMode.Gateway); 
         );
    

【讨论】:

以上是关于无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥

Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件

ADB无法使用解决办法

Ubuntu 80端口无法使用-非root用户无法使用1024以下端口

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

LINUX下的mail\mailx为啥无法使用外部SMTP发邮件