C# 在登录Cosmos DB之前,我如何检查是否已连接互联网?
我有这个代码,我用它来记录Cosmos数据库的活动C# 在登录Cosmos DB之前,我如何检查是否已连接互联网?,c#,xamarin,xamarin.forms,azure-cosmosdb,azure-cosmosdb-sqlapi,C#,Xamarin,Xamarin.forms,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我有这个代码,我用它来记录Cosmos数据库的活动 protected override async void OnStart() { await Helper.LogActivity("OnStart"); public static partial class Helper { public static async Task LogActivity(string activity) { var logItem = new LogItem()
protected override async void OnStart()
{
await Helper.LogActivity("OnStart");
public static partial class Helper
{
public static async Task LogActivity(string activity)
{
var logItem = new LogItem()
{
Activity = activity,
};
await CosmosDBService.InsertLogItem(logItem);
}
}
public class CosmosDBService
{
static DocumentClient docClient = null;
static readonly string databaseName = "Test";
static readonly string collectionName = "Logs";
static async Task<bool> Initialize()
{
if (docClient != null)
return true;
try
{
docClient = new DocumentClient(new Uri(APIKeys.CosmosEndpointUrl), APIKeys.CosmosAuthKey);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
docClient = null;
return false;
}
return true;
}
public async static Task InsertLogItem(LogItem item)
{
if (!await Initialize())
return;
await docClient.CreateDocumentAsync(
UriFactory.CreateDocumentCollectionUri(databaseName, collectionName),
item);
}
}
我关心的是,如果没有互联网连接。首先对此进行测试是一个好主意,还是应该在日志代码中添加一些try-catch异常
如果您能给我一些建议,告诉我如何使这段代码防弹,这样即使没有连接,OnStart中也不会抛出异常,我将不胜感激
如果日志记录失败,那么这对我来说不是问题,但是我想确保如果没有互联网连接或者cosmos db调用失败,代码不会失败 可以制作一份相关案例的清单: 1没有互联网 2互联网,但数据库处于脱机状态 3等等 然后测试您的代码并查看其行为,并确保您正在处理这些情况。 然后,您可以确定代码在这些情况下的行为。 它还将向您显示异常发生的位置,因此您可能希望添加try..catch块以防止其他故障 更新-关于处理错误案例: 因此,如果您的程序未能初始化docClient,则意味着它将无法写入任何日志 所以可能有一些方法可以解决这个问题 1您可以有一个回退日志记录方法,这意味着如果docClient==null,则将日志记录到控制台。因此,以后您可以在服务器上调查出了什么问题。如果服务器保留这些日志,则可以保存关键日志 2另一种回退方法是在内存列表中缓冲事件,并每隔10分钟重试连接数据库。如果连接成功,则将缓冲区清空到数据库中 3您可以实施重试计数,如在启动时重试连接X次,如果失败,您可以回退到其他方法或上述想法的组合。此外,您还可以拥有一个通过电子邮件或SMS向您发出警报的系统,具体取决于此服务的重要性 这些想法围绕连接到数据库的问题展开。 然而,这对实际插入仍然没有多大帮助,例如,如果数据库连接中途中断 因此,您可能仍然需要在InsertLogItem方法中围绕实际插入代码进行try-catch。这样就可以在每个wait Helper.LogActivityOnStart周围隐藏try catch;语句,因为它是集成的。如果该日志失败,您可以再次简化回退方法或操作 更新2 在此处查看CreateDocumentSync返回对象:
似乎您能够获得指示结果的状态代码,我会尝试中途关闭服务器,观察异步响应是否返回了适当的错误代码,或者是否抛出错误。如果它没有抛出,您可能不需要尝试捕获,只需检查返回代码,然后采取行动。您无法使它成为防弹的。你可以随时ping google Cosmos DB,ect,这将是相当多余的,但这并不能保证互联网或该网站在打电话时没有退出,所以你需要相应地处理。如果电话失败,我可以,因为日志记录不是那么重要。只是想确保这不会导致应用程序出现一些问题,并想知道如果没有internet,如何处理异常情况。这是否回答了您的问题?我不确定的是如何处理失败的情况。如果您对此有任何建议,我们将不胜感激。理想情况下,我希望避免在OnStart中等待呼叫时需要尝试捕获。我更新了我的答案以解决一些问题,并提出了避免尝试的建议。捕获,如果有帮助或回答问题不够好,请告诉我,谢谢!
ResourceResponse<Document> response = await client.CreateDocumentAsync(collectionLink, document);
Console.WriteLine(response.RequestCharge);
Console.WriteLine(response.ActivityId);
Console.WriteLine(response.StatusCode); // HttpStatusCode.Created or 201