httprequest-RestSharp RestResponse将内容截断为64 kb

嗨,我正在使用RestSharp创建对我的Web API的请求.不幸的是,response.content不包含完整的响应,当我通过浏览器或提琴手执行请求时,我能够看到它.内容被截断为64 kb.我在下面附上我的代码.

您能否建议什么可以解决此问题?

var request = new RestRequest("Products?productId={productId}&applicationId={applicationId}", Method.GET);
request.RequestFormat = DataFormat.Json;
request.AddParameter("productId", id, ParameterType.UrlSegment);
request.AddParameter("applicationId", Settings.ApplicationId, ParameterType.UrlSegment);
request.AddHeader("X-AppKey", token.AppKey);
request.AddHeader("X-Token", token.Token);
request.AddHeader("X-IsWebApi", "true");

RestResponse response = (RestResponse) client.Execute(request);

if (response.StatusCode == HttpStatusCode.Found)
{
    // The following line failes because response.Content is truncated.
    ShowProductModel showProductModel =
        new JavaScriptSerializer().Deserialize<ShowProductModel>(response.Content);

   // Do other things.
   return ShowProductApi(showProductModel, q, d, sort, breadcrumb);
}
最佳答案
看起来HttpStatusCode.Found可能是造成此问题的原因.这等同于Http状态代码302,它是重定向的一种形式.我不完全确定在这种情况下这是否一定是正确的做法.如果您已“找到”正在寻找的数据,则应返回成功级别状态代码,例如200(确定). Wikipedia的摘要为list of HTTP Status Codes,其中包含含义的摘要,并链接到许多其他资源.

我创建了一个演示程序解决方案(您可以找到它on GitHub)来显示差异.有一个WebApi服务器应用程序可以返回值列表(十六进制代码),而一个Console客户端应用程序可以使用WebApi应用程序上的资源.

这是ValuesFound资源,它返回HTTP状态代码302 / Found:

public class ValuesFoundController : ApiController
{
    public HttpResponseMessage Get(int count)
    {
        var result = Request.CreateResponse(HttpStatusCode.Found, Values.GetValues(count));
        return result;
    }
}

再次相同,但返回正确的200 / OK响应:

public class ValuesOkController : ApiController
{
    public HttpResponseMessage Get(int count)
    {
        var result = Request.CreateResponse(HttpStatusCode.OK, Values.GetValues(count));
        return result;
    }
}

在客户端,代码的重要部分是:

private static void ProcessRequest(int count, string resource)
{
    var client = new RestClient("http://localhost:61038/api/");
    var request = new RestRequest(resource+"?count={count}", Method.GET);
    request.RequestFormat = DataFormat.Json;
    request.AddParameter("count", count, ParameterType.UrlSegment);
    RestResponse response = (RestResponse) client.Execute(request);
    Console.WriteLine("Status was                : {0}", response.StatusCode);
    Console.WriteLine("Status code was           : {0}", (int) response.StatusCode);
    Console.WriteLine("Response.ContentLength is : {0}", response.ContentLength);
    Console.WriteLine("Response.Content.Length is: {0}", response.Content.Length);
    Console.WriteLine();
}

计数是要返回的十六进制代码的数量,资源是映射到以上控制器的资源的名称(ValuesOk或ValuesFound).

控制台应用程序要求用户输入一个数字,然后显示每个HTTP状态代码的响应长度.对于低值(例如200),两个版本都返回相同数量的内容,但是一旦响应内容超过64kb,则“ Found”版本将被截断,而“ Ok”版本则不会.

尝试使用值约为9999的控制台应用程序演示了这一点:

How many things do you want returned?
9999
Waiting on the server...
Status was                : OK
Status code was           : 200
Response.ContentLength is : 109990
Response.Content.Length is: 109990

Status was                : Redirect
Status code was           : 302
Response.ContentLength is : 109990
Response.Content.Length is: 65536

那么,为什么RestSharp会这样做?我不知道为什么它会在一个实例中而不是在另一个实例中截断内容.但是,可以假定在服务器已要求客户端将其重定向到另一个资源位置的情况下,超过64kb的内容不太可能有效.

例如,如果您使用Fiddler来查看网站的运行情况,则300范围(重定向)中的响应(例如302 / Found)确实具有少量的内容负载,该负载仅包含一些HTML,因此用户可以单击链接以手动进行操作如果浏览器没有自动为他们重定向,则重定向.真正的重定向位于Http“位置”标头中.

转载注明原文:httprequest-RestSharp RestResponse将内容截断为64 kb - 代码日志