- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在调用网络服务。它接受 Http Post。它是基于 Http 的简单 XML。您在请求正文中向它发送一个 XML 请求文档,您在响应正文中返回一个 XML 响应文档。我在我们的代码库中有一个很好的库,它是我们多年来构建的,它对请求和响应文档进行强类型序列化。一切正常。
现在,我正在集成的新服务并不总是在响应中发回相同的对象类型。在某些错误情况下,它会返回一个特殊的错误文档。当然,在这些情况下,我的反序列化失败并且响应数据丢失。我知道我有一个反序列化错误,但由于响应丢失,我不知道根本原因是什么。
我认为问题在于 GetResponseStream() 返回的流不支持查找操作,因此当我遇到错误时,我不能简单地倒回流并重新读取数据并以不同方式处理它。
我正在寻找更好地处理这个问题的策略。
我想我要做的是在我尝试反序列化之前将响应流复制到一个可搜索的内存流。然后,如果发生错误,我可以倒回内存流并以不同方式处理响应数据。 https://stackoverflow.com/a/3434077/90236 中有一个很好的例子.
有更好的方法吗?将响应流复制到内存流似乎有点浪费。
原始代码的简化版本:
AccountRequest requestVal = new AccountRequest();
// initialize requestVal object
var request = (HttpWebRequest)WebRequest.Create("http://example.com/service");
request.Method = "POST";
request.ContentType = "text/xml";
using (Stream webStream = request.GetRequestStream())
{
var serializer = new XmlSerializer(typeof(AccountRequest));
serializer.Serialize(webStream, requestVal);
webStream.Flush();
webStream.Close();
}
AccountResponse returnVal;
using (var response = (HttpWebResponse)request.GetResponse())
{
Stream responseStream = response.GetResponseStream();
var serializer = new XmlSerializer(typeof(responseStream));
try
{
returnVal = (AccountResponse)serializer.Deserialize(responseStream);
}
catch (Exception ex)
{
// if an exception occurs, the response stream data is lost.
// The responseStream is not seekable.
logger.ErrorFormat("After Exception:\n{0}", ex.ToString());
throw;
}
}
建议代码的简化版本:
AccountRequest requestVal = new AccountRequest();
// initialize requestVal object
var request = (HttpWebRequest)WebRequest.Create("http://example.com/service");
request.Method = "POST";
request.ContentType = "text/xml";
using (Stream webStream = request.GetRequestStream())
{
var serializer = new XmlSerializer(typeof(AccountRequest));
serializer.Serialize(webStream, requestVal);
webStream.Flush();
webStream.Close();
}
AccountResponse returnVal;
using (var response = (HttpWebResponse)request.GetResponse())
{
Stream responseStream = response.GetResponseStream();
using (MemoryStream ms = new MemoryStream())
{
// copy response stream to a seekable memorystream
int count = 0;
do
{
byte[] buf = new byte[1024];
count = responseStream.Read(buf, 0, 1024);
ms.Write(buf, 0, count);
} while (responseStream.CanRead && count > 0);
ms.Position = 0;
// now attempt to desrialize from the memory stream
var serializer = new XmlSerializer(typeof(AccountResponse));
try
{
returnVal = (AccountResponse)serializer.Deserialize(ms);
}
catch (Exception ex)
{
// if an exception occured, rewind the stream and write an error to the log
ms.Position = 0;
using (var reader = new StreamReader(ms, Encoding.UTF8))
{
logger.ErrorFormat("After Exception:\n{0}\n\nRespons:\n{1}",
ex.ToString(), reader.ReadToEnd());
}
throw;
}
}
}
最佳答案
如果返回的错误 XML 具有不同的根元素,您可以在实际反序列化之前使用 XmlSerializer.CanDeserialize
方法。
关于.net - 从具有不同类型的 HttpWebResponse GetResponseStream 反序列化 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21742199/
我刚刚注意到 C# 中的某些行为让我有些不快。我正在使用 C# 5 和 .NET 4.5。当我在 HTTPResponse 对象上调用 GetResponseStream() 时,我能够获得响应流,但
我一直收到这样的垃圾短信 �\b\0\0\0\0\0\0�\a`I�%&/m�{J�J��t�\b�`$ؐ@������iG# 在此函数末尾的 html 变量中。可以看到,通过注释掉的代码,两种插入C
从 GetResponseStream 读取 HTTP 响应的最佳方式是什么? 目前我正在使用以下方法。 Using SReader As StreamReader = New StreamReade
我知道这是一个菜鸟问题,但只是想知道 GetResponseStream() 是否可以在任何情况下返回 null? 最佳答案 好吧,这有点取决于具体的子类 - 但我从未见过任何这样做的子类,而且它没有
我正在尝试从 ResponeStream 读取字节,但我怎么能说要等待数据呢? 如果我在 GetResponseStream 之后设置断点并等待几秒钟,一切正常。使用 StreamReader.Rea
var h = (HttpWebRequest)WebRequest.Create(url); using (var hr = (HttpWebResponse)(await h.GetRespons
有什么方法可以知道响应流的长度,以便向用户显示下载进度的百分比而不是不确定的进度? 我发现 Response 如下所示,不可搜索且没有长度 最佳答案 尝试使用 WebResponse.ContentL
我看到很多示例,但它们都是一次将它们读入字节数组或 256 个字符,速度很慢。为什么? 仅将生成的 Stream 值转换为我可以解析的字符串是不可取的吗? 最佳答案 你可以使用StreamReader
我正在调用网络服务。它接受 Http Post。它是基于 Http 的简单 XML。您在请求正文中向它发送一个 XML 请求文档,您在响应正文中返回一个 XML 响应文档。我在我们的代码库中有一个很好
我正在使用 HttpWebResponse.GetResponseStream 访问互联网广播流,并希望从响应流中读取一些数据,然后断开连接。但是,我总是无限期地卡在流的 Dispose 上。下面的单
如果我们创建一个 HttpWebRequest 并从它的响应中获取 ResponseStream ,那么数据是否会立即完全下载,或者当我们调用流的 ReadBytes 时,只有数据会从网络下载然后读取
我正在研究下载管理器项目我正在使用: public Stream GetStream(string url) { HttpWebRequest request = (HttpWebReques
我正在使用 System.Net.HttpWebRequest类来实现一个简单的 HTTP 下载器,可以暂停、取消甚至在取消后恢复(使用 HTTP Range 请求 header )。 很明显,Htt
当我捕捉到 .NET WebException 时,我应该关闭/处置 Response.GetResponseStream() 吗? MSDN example不会关闭或处理异常中的任何内容。 很多SO
我们正在读取来自 HttpWebResponse 的响应,我们认为响应本身非常正常。但是当我们尝试读取它的字符串表示形式时,我们只会收到奇怪的字符,而不是 json 格式的普通字符。谁能告诉我们这里出
我一直在想这个问题。在我们的一台客户端(Windows 7、.NET 2.0)机器上,以下代码似乎失败了(导致应用程序关闭),但似乎没有抛出任何异常。 在日志中打印了“发送休息请求”,然后什么也没有。
我正在尝试使用 HttpWebRequest 和 HttpWebResponse 从网页中检索 HTML 代码。 response = (HttpWebResponse)request.GetResp
我正在尝试从 HTTP 流直接上传到 S3,而不是首先存储在内存中或作为文件。我已经将 Rackspace 云文件作为 HTTP 到 HTTP 来执行此操作,但是 AWS 身份验证超出了我的范围,因此
由于某种超出我理解的原因,对特定网站 ( https://learningnetwork.cisco.com/people/mrollins?view=profile ) 的请求导致了一个 reqsp
我想从服务器读取 xls。我使用 WebClient 成功下载了文件,但现在我想打开它而不保存文件。 var request = WebRequest.Create(location)
我是一名优秀的程序员,十分优秀!