【问题标题】:Process RestSharp Response as a Stream after checking the response status?检查响应状态后将 RestSharp 响应作为流处理?
【发布时间】:2021-01-23 02:00:34
【问题描述】:

我必须能够使用 RestSharp 从我们的 Rest API 流式传输大文件。这样做的规范方法是在请求上设置“ResponseWriter”属性:

var client = new RestClient
var request = new RestRequest();
IRestResponse response;
request.ResponseWriter = connectStream => {
  if(response.StatusCode == ResponseStatus.OK)
  {
     CloudStorage.UploadFromStream(connectStream);
  }
  else
  {
     LoggerService.LogErrorFromStream(connectStream);
  }
};
response = client.Execute(request);

我的问题是“响应”对象(包括状态、状态代码、标题等)在 RestSharp 完成要求我的 ResponseWriter 处理整个流之前不可用。

这似乎违反直觉,因为当然用户可能希望根据响应状态更改响应流的处理方式。

如何在开始处理响应正文的流之前获取此状态信息?

【问题讨论】:

    标签: c# rest stream restsharp


    【解决方案1】:

    我想这在here之前已经被举报过。

    看起来他们released对此进行了更新,而这样做的方法是改用AdvancedResponseWriter

    var client = new RestClient
    var request = new RestRequest();
    IRestResponse response;
    request.AdvancedResponseWriter = (stream, response) => {
        // Should be able to access response which is an IHttpResponse
    };
    response = client.Execute(request);
    

    Docs.

    【讨论】:

      【解决方案2】:

      看起来在调用 ResponseWriter 之前设置了一些标头,这发生在 ProcessResponseStream 方法中,并且在之后设置了一些标头。状态是调用 ResponseWriter 之后设置的那些标头之一。

      见代码:RestSharp Http.cs

             private void ExtractResponseData(HttpResponse response, HttpWebResponse webResponse)
              {
                  using (webResponse)
                  {
      #if FRAMEWORK
                      response.ContentEncoding = webResponse.ContentEncoding;
                      response.Server = webResponse.Server;
                      response.ProtocolVersion = webResponse.ProtocolVersion;
      #endif
                      response.ContentType = webResponse.ContentType;
                      response.ContentLength = webResponse.ContentLength;
      
                      Stream webResponseStream = webResponse.GetResponseStream();
      
      #if WINDOWS_PHONE
                      if (string.Equals(webResponse.Headers[HttpRequestHeader.ContentEncoding], "gzip", StringComparison.OrdinalIgnoreCase))
                      {
                          GZipStream gzStream = new GZipStream(webResponseStream);
      
                          ProcessResponseStream(gzStream, response);
                      }
                      else
                      {
                          ProcessResponseStream(webResponseStream, response);
                      }
      #else
                      this.ProcessResponseStream(webResponseStream, response);
      #endif
      
                      response.StatusCode = webResponse.StatusCode;
                      response.StatusDescription = webResponse.StatusDescription;
                      response.ResponseUri = webResponse.ResponseUri;
                      response.ResponseStatus = ResponseStatus.Completed;
      

      【讨论】:

      • 这根本不能回答问题。你有什么修复它的建议?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2020-02-20
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多