Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在登录Cosmos DB之前,我如何检查是否已连接互联网?_C#_Xamarin_Xamarin.forms_Azure Cosmosdb_Azure Cosmosdb Sqlapi - Fatal编程技术网

C# 在登录Cosmos DB之前,我如何检查是否已连接互联网?

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()

我有这个代码,我用它来记录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()
        {
            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