You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET 6中使用ServiceStack HttpUtils获取错误响应体

解决ServiceStack HttpUtils在.NET 6中GetResponseBodyAsync返回空字符串的问题

常见原因及解决方法:

  • 确认异常类型为WebServiceException
    GetResponseBodyAsync 是ServiceStack WebServiceException 的专属扩展方法,若捕获的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:50:01