RestSharp RestResponse将内容截断为64 kb

时间:2014-08-29 14:35:05

标签: httprequest httpresponse restsharp

您好我正在使用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);
}

2 个答案:

答案 0 :(得分:3)

这是因为RestSharp使用.NET Framework中的HttpWebRequest类。该类有一个名为DefaultMaximumErrorResponseLength的静态属性。此属性确定错误响应的最大长度,此属性的默认值为64Kb。

您可以在设置RestRequest类之前更改该属性的值。

以下是一些代码:

 HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576;

 var request = new RestRequest("resource" + "/", Method.POST)
    {
        RequestFormat = DataFormat.Json,
        JsonSerializer = new JsonSerializer()
    };

这样你的错误响应可以更长,没有问题。

答案 1 :(得分:1)

看起来HttpStatusCode.Found可能导致问题。这相当于Http状态代码302,这是一种重定向形式。在这种情况下,我不完全确定这是否正确。如果您“找到”了您要查找的数据,则应返回成功级别状态代码,例如200(好的)。维基百科有一个list of HTTP Status Codes,其摘要是关于它们的含义,并链接到许多其他资源。

我已经创建了一个小的演示解决方案(你可以找到它on GitHub)来显示差异。 WebApi服务器应用程序返回值列表(十六进制代码)和一个使用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();
}

count是要返回的十六进制代码的数量,resource是映射到上述控制器的资源的名称(ValuesOkValuesFound

控制台应用程序向用户询问一个数字,然后显示每个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“Location”标题中。