using System; using System.Linq; using System.Threading.Tasks; using Aliyun.Api.LogService; using Aliyun.Api.LogService.Domain; using Aliyun.Api.LogService.Domain.Log; using Aliyun.Api.LogService.Infrastructure.Protocol; namespace HDL_ON.Common.AliyunLog { public class AliyunLogInvokeAsync { public AliyunLogInvokeAsync() { } /// /// 执行请求方法。 /// public static async Task Invoke(ILogServiceClient client) { var response = await client.GetLogsAsync ( // 「必填参数」会在 Request 构造器中列出,并且不可set; new GetLogsRequest("example-logstore", (Int32)DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeSeconds(), (Int32)DateTimeOffset.UtcNow.ToUnixTimeSeconds()) { // 「可选参数」不会在 Request 构造器中列出,可通过setter设置。 Offset = 1, Line = 100, } ); var result = response // 此方法会确保返回的响应失败时候抛出`LogServiceException`。 .EnsureSuccess() // 此处获取Result是安全的。 .Result; Console.WriteLine($"RequestId:{response.RequestId}"); Console.WriteLine($"日志总数:{result.Count}"); Console.WriteLine($"首条日志:{result.Logs.FirstOrDefault()}"); return result; } /// /// 在调用时可使用扩展方法,扩展方法会将简单的请求对象的属性展开到方法入参中。 /// 使用扩展方法 `using Aliyun.Api.Log;` 即可。 /// public static async Task InvokeUsingExtension(ILogServiceClient client) { var response = await client.GetLogsAsync ( // 「必填参数」作为方法的普通必须参数 "example-logstore", DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow, // 「可选参数」作为方法的可选参数,可通过命名参数方式指定 offset: 1, line: 10 ); var result = response // 此方法会确保返回的响应失败时候抛出`LogServiceException`。 .EnsureSuccess() // 此处获取Result是安全的。 .Result; Console.WriteLine($"RequestId:{response.RequestId}"); Console.WriteLine($"日志总数:{result.Count}"); Console.WriteLine($"首条日志:{result.Logs.FirstOrDefault()}"); return result; } /// /// 处理服务器返回(包含在Response中)的错误。 /// public static async Task InvokeWithErrorHandling(ILogServiceClient client) { var response = await client.GetLogsAsync ( // 「必填参数」作为方法的普通必须参数 "example-logstore", DateTimeOffset.UtcNow.AddDays(-1), DateTimeOffset.UtcNow, // 「可选参数」作为方法的可选参数,可通过命名参数方式指定 offset: 1, line: 10 ); GetLogsResult result; // 尝试处理可处理的错误。 if (!response.IsSuccess) { // 错误码 var errorCode = response.Error.ErrorCode; // 错误消息 var errorMessage = response.Error.ErrorMessage; Console.WriteLine($"RequestId:{response.RequestId}"); Console.WriteLine($"错误码:{errorCode}"); Console.WriteLine($"错误信息:{errorMessage}"); // `ErrorCode`类可支持与自身实例或字符串进行对比。 if (errorCode == ErrorCode.SignatureNotMatch /* SDK中预定义的错误码 */) { // 在这里处理业务可处理的错误。。。。。。 Console.WriteLine("Signature not match, {0}.", errorMessage); } else if (errorCode == "ParameterInvalid" /* 业务相关特殊的SDK中未定义的错误码 */) { // 在这里处理业务可处理的错误。。。。。。 Console.WriteLine("Parameter invalid, {0}.", errorMessage); } // 任何处理不到的错误请务必抛出异常中断原流程,避免外部获取到 null 的结果! throw new Exception("这里可以是系统的业务异常。" + response.Error /* 最好带上服务返回的错误信息以便调试 */); } else { // 此处获取Result是安全的。 result = response.Result; } Console.WriteLine($"RequestId:{response.RequestId}"); Console.WriteLine($"日志总数:{result.Count}"); Console.WriteLine($"首条日志:{result.Logs.FirstOrDefault()}"); return result; } /// /// 处理以异常形式抛出的错误。 /// public static async Task InvokeWithExceptionHandling(ILogServiceClient client) { try { return await Invoke(client); } catch (LogServiceException e) { // 错误码 var errorCode = e.ErrorCode; // 错误消息 var errorMessage = e.ErrorMessage; Console.WriteLine($"RequestId:{e.RequestId}"); Console.WriteLine($"错误码:{errorCode}"); Console.WriteLine($"错误信息:{errorMessage}"); // `ErrorCode`类可支持与自身实例或字符串进行对比。 if (errorCode == ErrorCode.SignatureNotMatch /* SDK中预定义的错误码 */) { // 在这里处理业务可处理的错误。。。。。。 Console.WriteLine("Signature not match, {0}.", errorMessage); } else if (errorCode == "ParameterInvalid" /* 业务相关特殊的SDK中未定义的错误码 */) { // 在这里处理业务可处理的错误。。。。。。 Console.WriteLine("Parameter invalid, {0}.", errorMessage); } // 任何处理不到的错误请务必抛出异常中断原流程,避免外部获取到 null 的结果! throw new Exception("这里可以是系统的业务异常。", e /* 在自定义的异常中最好带上服务返回的异常以便调试 */); } } } }