Skip to content

[FEATURE] 拦截器上下文中获取更多信息 #202

@EmmaCCC

Description

@EmmaCCC

⚠⚠ 请注意:不符合格式要求的 Issue 可能会被直接关闭。


关于建议的简单描述

        /// <summary>
        /// 获取小程序二维码
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<WxaGetWxaCodeUnlimitResponse> WxaGetWxaCodeUnlimit(MpQrCodeCreateDto dto)
        {
            var request = new WxaGetWxaCodeUnlimitRequest()
            {
                PagePath = dto.Page,
                Scene = dto.Scene,
                IsHyaline = dto.IsHyaline,
                Width = dto.Width,
                AccessToken = _accessTokenManager.GetAccessToken()
            };
            if (!_hostEnvironment.IsProduction())
            {
                request.RequireCheckPath = false;
                request.EnvironmentVersion = "develop";
            }
            var response = await _client.ExecuteWxaGetWxaCodeUnlimitAsync(request);
            Error.ThrowIf(!response.IsSuccessful(), $"获取小程序二维码失败,请稍后再试[{response.ErrorCode}]");
            return response;
        }

        public class WechatCallLogIntercepter : HttpInterceptor
        {
            private static readonly Logger _logger = LogManager.GetCurrentClassLogger();
        
            public override async Task BeforeCallAsync(HttpInterceptorContext context, CancellationToken cancellationToken = default)
            {
                var url = context.FlurlRequest.Url.ToString();
                var requestBody = string.Empty;
                if (context.FlurlRequest.Content != null)
                {
                    requestBody = await context.FlurlRequest.Content.ReadAsStringAsync();
                }
                context.Items.Add("body", requestBody);
            }
        
            public override async Task AfterCallAsync(HttpInterceptorContext context, CancellationToken cancellationToken = default)
            {
                var url = context.FlurlRequest.Url.ToString();
                var requestBody = context.Items["body"]?.ToString();
                var responseBody = await context.FlurlResponse.ResponseMessage.Content.ReadAsStringAsync();
                var sb = new StringBuilder();
                sb.AppendLine("微信接口请求");
                sb.AppendLine($"请求地址:{url}");
                sb.AppendLine($"请求体:{requestBody}");
                sb.AppendLine($"响应码:{context.FlurlResponse.StatusCode}");
                sb.Append($"响应体:{responseBody}");
        
                _logger.Info($"{sb}");
            }
        }

例如在 HttpInterceptorContext 中获取当前请求的微信client,当前请求的参数 WxaGetWxaCodeUnlimitRequest,
WxaGetWxaCodeUnlimitResponse等,我看了源码,应该就是ICommonClient, ICommonRequest, ICommonResponse这些对象
可能要对某些特定的对象或者请求做一下操作或记录,这些参数都没有携带导context中,导致无法在拦截器中判断某些特定的请求,只能通过url判断感觉有点不优雅


实现思路或解决方案


补充说明

请在此填写任何其他可以帮助说明的信息。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesttodoUnder construction

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions