如何在.NET 6中使用ServiceStack HttpUtils获取错误响应体
解决ServiceStack HttpUtils在.NET 6中GetResponseBodyAsync返回空字符串的问题
常见原因及解决方法:
确认异常类型为WebServiceException
GetResponseBodyAsync是ServiceStackWebServiceException的专属扩展方法,若捕获的是HttpRequestException等其他类型异常,调用该方法会返回空字符串。需先将异常转换为WebServiceException处理:try { var response = await GetApiUrl().CombineWith("/Controller/DoSomething").PostJsonToUrlAsync(body); } catch (Exception ex) { if (ex is WebServiceException webEx) { var errorBody = await webEx.GetResponseBodyAsync(); // 处理错误内容 } else { // 处理非ServiceStack类型异常 } }避免响应流被提前释放
若响应流在异常抛出前已被读取或自动释放,GetResponseBodyAsync将无法获取内容。可直接通过WebServiceException的ResponseStream属性读取原始流:catch (WebServiceException webEx) { using var reader = new StreamReader(webEx.ResponseStream); var errorBody = await reader.ReadToEndAsync(); // 若后续需再次读取,重置流位置 webEx.ResponseStream.Position = 0; }直接使用WebServiceException内置属性
ServiceStack的WebServiceException已封装了常用错误信息,无需手动读取响应体:catch (WebServiceException webEx) { var statusCode = webEx.StatusCode; // HTTP状态码 var errorMessage = webEx.Message; // 错误消息 var errorResponse = webEx.ResponseDto; // 强类型错误响应(若接口返回) }配置请求保留响应流
发起请求时,可通过选项强制保留响应流,避免自动释放:var requestUrl = GetApiUrl().CombineWith("/Controller/DoSomething"); var response = await requestUrl.PostJsonToUrlAsync(body, req => { req.KeepAlive = true; // 其他请求配置 });
内容的提问来源于stack exchange,提问作者Nesse
相关产品推荐
相关产品推荐

