如何正确记录requestMessage.Content的实际请求内容?
解决API请求Body内容日志记录问题
问题原因
StringContent.ToString() 默认返回的是类型名称(即System.Net.Http.StringContent),而非实际的请求内容,因此日志无法显示具体的JSON数据。
方案一:直接使用已序列化的变量(推荐)
你已经提前将请求对象序列化为requestJson变量,直接将该变量写入日志即可,无需从requestMessage.Content读取:
using var requestMessage = CreateRequest(authenticationResponse, HttpMethod.Post, uri); var requestJson = JsonConvert.SerializeObject(request, _serializerSettings); requestMessage.Content = new StringContent(requestJson, Encoding.UTF8, "application/json"); // 直接使用已序列化的requestJson记录日志 _logger.LogInformation($"[{nameof(PerformApiSearchQueryAsync)}] RequestContent='{requestJson}'"); // 执行API搜索 using var response = await _client.SendAsync(requestMessage); _logger.LogInformation($"[{nameof(PerformApiSearchQueryAsync)}] Api responded with '{response.StatusCode}'. accesstoken='{authenticationResponse.AccessToken.Sanitize()}'");
方案二:从StringContent中读取内容(需处理流重置)
如果必须从requestMessage.Content读取内容,需调用ReadAsStringAsync()方法,但要注意HTTP内容流默认仅能读取一次,读取后需重置流位置才能保证请求正常发送:
using var requestMessage = CreateRequest(authenticationResponse, HttpMethod.Post, uri); var requestJson = JsonConvert.SerializeObject(request, _serializerSettings); requestMessage.Content = new StringContent(requestJson, Encoding.UTF8, "application/json"); // 读取内容并记录日志 var contentString = await requestMessage.Content.ReadAsStringAsync(); _logger.LogInformation($"[{nameof(PerformApiSearchQueryAsync)}] RequestContent='{contentString}'"); // 重置内容流,确保SendAsync能正常读取 var byteContent = await requestMessage.Content.ReadAsByteArrayAsync(); requestMessage.Content = new ByteArrayContent(byteContent); requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); // 执行API搜索 using var response = await _client.SendAsync(requestMessage); _logger.LogInformation($"[{nameof(PerformApiSearchQueryAsync)}] Api responded with '{response.StatusCode}'. accesstoken='{authenticationResponse.AccessToken.Sanitize()}'");
内容的提问来源于stack exchange,提问作者wdtj
相关产品推荐
相关产品推荐

