- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个桌面客户端,它通过 Http 与服务器端通信。当服务器在数据处理方面出现一些问题时,它会在具有正确的 Http 代码(主要是 HTTP-400)的 Http 响应正文中返回 JSON 中的错误描述。
当我读取 HTTP-200 响应时一切正常并且此代码有效:
using (var response = await httpRequest.GetResponseAsync(token))
{
using (var reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
{
return await reader.ReadToEndAsync();
}
}
但是当发生错误并抛出并捕获 WebException 时,会出现以下代码:
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
using (var response = (HttpWebResponse) ex.Response)
{
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
{
var json = reader.ReadToEnd();
}
}
}
}
}
我已经对它做了一些事情,也许可以让它工作,但接下来会发生:response.ContentLength
有效 (184)但是 stream.Length
是 0之后我无法读取 json(它是 ""
)我什至不知道去哪里看,因为一切看起来都应该有效。
可能是什么问题?
最佳答案
经过一个月几乎每天都在思考,我找到了解决方法。
问题是 WebException.Response.GetResponseStream()
返回的流与请求期间获得的流不完全相同(现在找不到指向 msdn 的链接),到我们到达时捕获异常并读取此流实际响应流丢失(或类似的东西,真的不知道并且无法在网上找到任何信息,除了查看现在开源的 CLRCore 之外)。
要在捕获 WebException
之前保存实际响应,您必须在 HttpRequest
上设置 KeepAlive
属性,瞧,您在捕获异常时会得到响应.所以工作代码看起来像这样:
try
{
var httpRequest = WebRequest.CreateHttp(Protocol + ServerUrl + ":" + ServerPort + ServerAppName + url);
if (HttpWebRequest.DefaultMaximumErrorResponseLength < int.MaxValue)
HttpWebRequest.DefaultMaximumErrorResponseLength = int.MaxValue;
httpRequest.ContentType = "application/json";
httpRequest.Method = method;
var encoding = Encoding.GetEncoding("utf-8");
if (httpRequest.ServicePoint != null)
{
httpRequest.ServicePoint.ConnectionLeaseTimeout = 5000;
httpRequest.ServicePoint.MaxIdleTime = 5000;
}
//----HERE--
httpRequest.KeepAlive = true;
//----------
using (var response = await httpRequest.GetResponseAsync(token))
{
using (var reader = new StreamReader(response.GetResponseStream(), encoding))
{
return await reader.ReadToEndAsync();
}
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
using (var response = (HttpWebResponse)ex.Response)
{
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
{
return reader.ReadToEnd();
//or handle it like you want
}
}
}
}
}
我不知道像那样保持所有连接是否有效,但由于它帮助我读取来自服务器的实际响应,我认为它可能对遇到同样问题的人有所帮助。
编辑:同样重要的是不要弄乱 HttpWebRequest.DefaultMaximumErrorResponseLength
。
关于c# - 无法从 WebException 获取 ResponseStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28317386/
看一下 GoogleAPI reference 的 graphics 部分.它表示 loadImage 采用 string 或 XMLHttp 的 responseStream 属性。通过 XMLHt
我有一个桌面客户端,它通过 Http 与服务器端通信。当服务器在数据处理方面出现一些问题时,它会在具有正确的 Http 代码(主要是 HTTP-400)的 Http 响应正文中返回 JSON 中的错误
我有一个用 C# 编写的独立处理程序 (.ASHX),用于处理携带 XML 负载的传入推送通知,然后解析这些 XML 并提取和处理从中获取的任何必要信息。问题是我无法在本地测试这个,因为我们的开发环境
我有一个正在运行的 Azure 辅助角色,除其他功能外,它每隔 80 秒左右发出一些 HTTP 请求。这种情况不断发生。随着规模的扩大,它可能会发出更多的 HTTP 请求,因此我编写了使用 Begin
使用 AWSSDK.S3 nuget 包,我试图返回一个从 S3 存储桶中检索到的文件。我的出发点是基于此 SO answer 中给出的示例. 示例 Controller 代码: public Fil
我们的 ASP.net 应用程序需要将一些请求中继到另一台服务器,获取数据并提供数据。我们可以将数据下载到文件中并提供服务,或者直接提供从源服务器到客户端的响应流。数据包括js/css/images/
我想知道我最终会从这段代码中获得任何未关闭的流: Public Function [Get](ByVal url As String) As String Using reade
来自 MSDN: "The Abort method cancels a request to a resource. After a request is canceled, calling the
如果有人能帮我解决这个问题,我将不胜感激。我有一些 C# 代码可以读取网页的内容,以便稍后进行解析。代码是: private StringReader ReadInUrl(string
我是一名优秀的程序员,十分优秀!