2014-08-29 2 views
1

Привет Я использую RestSharp для создания запроса к моему веб-API. К сожалению, response.content не содержит полного ответа, который я могу видеть при выполнении запроса через браузер или скрипач. Содержимое усекается до 64 кб. Я прилагаю свой код ниже.RestSharp RestResponse обрезает содержимое до 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); 
} 

ответ

1

Похоже, что HttpStatusCode.Found может быть причиной. Это соответствует HFC Status Code 302, который является формой перенаправления. Я не совсем уверен, что в этом случае это будет правильно. Если вы «нашли» данные, которые ищете, вы должны вернуть код состояния уровня успеха, например. 200 (ОК). В Википедии есть list of HTTP Status Codes с резюме о том, что они означают, и ссылки на множество других ресурсов.

Я создал небольшое демонстрационное решение (вы можете найти его on GitHub), чтобы показать разницу. Существует приложение сервера WebApi, которое возвращает список значений (шестнадцатеричные коды) и клиентское приложение консоли, которое потребляет ресурсы в приложении WebApi.

Вот ресурс ValuesFound, который возвращает код HTTP Status 302/Найдено:

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 является n umber шестнадцатеричных кодов для возврата, а resource - это имя ресурса (либо ValuesOk, либо ValuesFound), которые сопоставляются с указанными выше контроллерами.

Приложение-консоль запрашивает у пользователя число, а затем показывает длину ответа для каждого кода состояния HTTP. Для низких значений, скажем 200, обе версии возвращают одинаковое количество контента, но как только контент ответа превышает 64 КБ, тогда версия «Найдена» усекается, а версия «Ок» - нет.

Попытка консольное приложение со значением около 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 это сделать? Я не знаю, почему он обрезает контент в одном экземпляре, а не в другом. Однако можно предположить, что в ситуации, когда сервер обратился к клиенту с просьбой перенаправить на другое место ресурса, контент, превышающий 64 КБ, вряд ли будет действительным.

Например, если вы используете Fiddler, чтобы посмотреть, что делают сайты, ответы в диапазоне 300 (перенаправление), такие как 302/Found, имеют небольшую полезную информацию контента, которая просто содержит небольшой HTML-код, чтобы пользователь мог щелкнуть ссылка на перенаправление вручную, если браузер автоматически не перенаправляет их. Реальное перенаправление находится в заголовке Http «Location».

3

Это происходит потому, что RestSharp использует класс HttpWebRequest из .NET Framework. Этот класс имеет статический атрибут DefaultMaximumErrorResponseLength. Этот атрибут определяет максимальную длину ответа об ошибке, а значение по умолчанию для этого атрибута - 64 КБ.

Вы можете изменить значение этого атрибута перед установкой класса RestRequest.

Вот код:

HttpWebRequest.DefaultMaximumErrorResponseLength = 1048576; 

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

Таким образом, ваш ответ ошибка может быть больше без problemns.

Смежные вопросы