Похоже, что 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».