c# - HttpWebRequest Response Stream 只返回 64k 的数据

标签 c# .net rest httpwebrequest client

我们正在使用 Web API 为我们的应用程序提供 RESTful 服务,该应用程序目前正在使用 WPF,因此需要服务客户端。

我们遇到的问题是,当响应大小超过 64k 时,底层流会在 64k 处停止并在请求更多数据时抛出异常,尽管 ContentLength 更大(在测试用例中为 ~125k)

这是我们调用服务的方法:

private HttpWebResponse CallServiceMethod<TDto>(Uri serviceURL, string method, out WebException requestExceptionDetail, TDto dto = null) where TDto : DTOBase
{
  HttpWebRequest request;
  HttpWebResponse response;
  Encoding enc;
  string encodedDto;
  byte[] encodedDtoArray;
  Stream writeStream;

  request = WebRequest.CreateHttp(serviceURL);
  request.Method = method;

  if (dto != null)
  {
    enc = UTF8Encoding.Default;
    encodedDto = String.Concat("=", JsonConvert.SerializeObject(dto));
    encodedDtoArray = enc.GetBytes(encodedDto);

    request.ContentLength = encodedDtoArray.Length;
    request.ContentType = "application/x-www-form-urlencoded";

    writeStream = request.GetRequestStream();
    writeStream.Write(encodedDtoArray, 0, encodedDtoArray.Length);
    writeStream.Close();
  }

  requestExceptionDetail = null;

  try
  {
    response = (HttpWebResponse)request.GetResponse();
  }
  catch (WebException wex)
  {
    response = (HttpWebResponse)wex.Response;
    requestExceptionDetail = wex;
  }

  return response;
}

...这里有一个解码响应的方法,中间有一些胶合逻辑来传递响应。

private TObjectType DecodeResponse<TObjectType>(HttpWebResponse webResponse)
{
  Encoding enc;
  StreamReader responseReader;
  string responseText;
  TObjectType retVal;

  // Obtain a string from the underlying response string
  enc = UTF8Encoding.Default;
  responseReader = new StreamReader(webResponse.GetResponseStream(), enc);
  responseText = responseReader.ReadToEnd();

  // Use JSon to deserialise the string
  retVal = JsonConvert.DeserializeObject<TObjectType>(responseText);

  return retVal;
}

这种事情我们也试过,但是没用:

private TObjectType DecodeResponse<TObjectType>(HttpWebResponse webResponse)
{
  Encoding enc;
  StreamReader responseReader;
  string responseText;
  TObjectType retVal;
  char[] buffer;
  int bufferSize, startPos, totalLength, readLength;
  StringBuilder sbx;

  // Obtain a string from the underlying response string
  enc = UTF8Encoding.Default;
  responseReader = new StreamReader(webResponse.GetResponseStream(), enc);

  totalLength = (int)webResponse.ContentLength;
  bufferSize = 65536;
  startPos = 0;
  buffer = new char[bufferSize];

  sbx = new StringBuilder(totalLength);
  //webResponse.GetResponseStream().

  while (startPos < totalLength)
  {
    readLength = Math.Min(bufferSize, totalLength - startPos);
    responseReader.Read(buffer, startPos, readLength);
    sbx.Append(buffer, 0, readLength);

    startPos += readLength;
  }

  //responseText = responseReader.ReadToEnd();
  responseText = sbx.ToString();

  // Use JSon to deserialise the string
  retVal = JsonConvert.DeserializeObject<TObjectType>(responseText);

  return retVal;
}

任何帮助将不胜感激;-)

最佳答案

进一步调查显示 HttpWebRequest 有一个名为 DefaultMaximumErrorResponseLength 的静态属性,默认设置为 65536。

它会合谋认为 .NET 框架包含这个恶魔般的属性,只要您的响应是文本/纯文本,它就可以工作,但如果它需要任何闭包 - 例如 XML 或 JSON - 它就会中断。

如需更多信息,请引用:

关于c# - HttpWebRequest Response Stream 只返回 64k 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355820/

相关文章:

c# - 如何使用谓词在 C# 中创建扩展方法

.net - 确定正在运行的应用程序中的 .net 框架版本

c# - 从 TypeSyntax 获取 SyntaxTree

java - 使用 jersey-Rest 的 Post 方法并从 url 获取参数

java - Spring MVC PATCH方法: partial updates

java - Spring:为什么普通 Controller 和@ResponseBody Controller 生成不同的代码?

c# - 如何在不需要提供用户详细信息的情况下从特定的远程分支中提取最新信息?

c# - 如何在 postgresql 中显示来自 pg_stat_activity 的 unlisten * 查询

.net - 解决 WCF 错误 : Metadata publishing for this service is currently disabled

c# - 允许用户从谷歌驱动器中选择文件上传到我的服务器