无法使用 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 文件
Ubuntu 80端口无法使用-非root用户无法使用1024以下端口