我必须能够使用RestSharp从Rest中流出大型文件。这样做的标准方法是对请求设置“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);我的问题是,“response”对象(包括状态、状态代码、头等)直到 RestSharp要求 ResponseWriter处理完整个流之后才可用。
这似乎违反了直觉,因为用户可能希望根据响应状态更改响应流的处理方式。
在开始处理响应体的流之前,如何获得此状态信息?
发布于 2021-01-22 18:00:34
我认为这在这里之前就有报道了。
看起来他们已发布是对此的一个更新,而方法是使用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);文档。
发布于 2016-10-04 16:21:06
看起来,在调用ResponseWriter之前设置了一些标头,这发生在ProcessResponseStream方法中,还有一些标头是在后面设置的。状态是在调用ResponseWriter之后设置的标头之一。
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;https://stackoverflow.com/questions/31443111
复制相似问题