- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 WCF REST 项目,它将 http 状态代码作为 WebFaultExceptions 返回。这对于 GET 调用非常有效,但我在为 POST 调用返回 WebFaultException 时遇到问题。请求正文中的数据使用的内容类型为“application/x-www-form-urlencoded;charset=utf-8”。我认为问题是当上下文切换出 using 子句以抛出 WebFaultException 时,底层请求流被关闭。
如果我在“using”子句之前抛出 WebFaultException,异常将按预期返回。如果我从“using”子句中抛出 WebFaultException,则异常不会返回给客户端。
对于如何在使用流阅读器读取请求正文时能够成功抛出 WebFaultException,有没有人有任何建议?
这是我的服务器端代码的简化版本。请注意,此示例的 httpstatuscodes 对我的实际实现而言并不现实。
[WebInvoke(Method = "POST"
, UriTemplate = "urls/{id}"
, BodyStyle = WebMessageBodyStyle.WrappedRequest
)]
public string PostItem(string id, object streamdata)
{
int _id = 0;
if (int.TryParse(companyIdSr2, out _id))
{
using (System.IO.StreamReader reader = new System.IO.StreamReader(streamdata))
{
string body = reader.ReadToEnd();
if(string.IsNullOrEmpty(body))
{
// this exception doesn't make it back to the client's request object
ThrowError(HttpStatusCode.BadRequest, "empty body");
}
}
}
else
{
// this exception is successfully returned to the client's request object
ThrowError(HttpStatusCode.BadRequest, "invalid id");
}
}
private static void ThrowError(HttpStatusCode status, string message)
{
request_error error = new request_error
{
request_url = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString,
error_status_code = status.ToString(),
error_message = message,
};
throw new WebFaultException<request_error>(error, status);
}
public class request_error
{
[XmlElement("request_url")]
public string request_url { get; set; }
[XmlElement("error_status_code")]
public string error_status_code { get; set; }
[XmlElement("error_message")]
public string error_message { get; set; }
}
我看过这个问题 - Wrong WebFaultException when using a Stream and closing the stream - 尽管它在一定程度上解决了这个问题,但仍 Unresolved 是不处置或关闭流是否合理。
非常感谢,
特里
最佳答案
question您链接到的内容现在已收到解决您问题的已接受答案。
你说:
and although it addresses the issue somewhat, left unanswered is whether it is reasonable to not dispose or close the stream.
对此,答案是:
But it would be better to not leave the StreamReader without disposing it because it can't clean any unmanaged resources.
为了支持这一点,我们在另一个 StackOverflow 线程上有以下答案,该线程争论为什么调用 Dispose()
很重要:https://stackoverflow.com/a/2548694/700926
为了解决您在问题中提出的最初问题(WebFaultException
不会发送回客户端),我最终按照 this answer 中的建议做了- 将 System.IO.StreamReader
子类化并覆盖 Close
,以便它告诉 StreamReader 仅释放非托管资源而不关闭流。
我的 WcfFriendlyStreamReader 看起来像这样:
public class WcfFriendlyStreamReader : StreamReader
{
public WcfFriendlyStreamReader(Stream s) : base(s) { }
public override void Close()
{
base.Dispose(false);
}
}
从 MSDN documentation 可以看出调用 Dispose(false)
只会释放非托管资源。正如反编译器所揭示的那样,这也会导致 Stream
保持打开状态,这似乎可以解决问题:
protected override void Dispose(bool disposing)
{
try
{
if (this.LeaveOpen || !disposing || this.stream == null)
return;
this.stream.Close();
}
finally
{
if (!this.LeaveOpen && this.stream != null)
{
this.stream = (Stream) null;
this.encoding = (Encoding) null;
this.decoder = (Decoder) null;
this.byteBuffer = (byte[]) null;
this.charBuffer = (char[]) null;
this.charPos = 0;
this.charLen = 0;
base.Dispose(disposing);
}
}
}
关于c# - 如何在 C# WCF REST POST 中的 StreamReader.ReadToEnd() 之后抛出 WebFaultException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19986488/
文档只是说 ReadBlock 是 “Read 的阻塞版本” 但这意味着什么? 之前有人问过这个问题,嗯? http://www.pcreview.co.uk/forums/thread-138578
我对 StreamReader 类的两个不同构造函数有点困惑,即 1.StreamReader(流) 我知道它需要流字节作为输入,但相应的输出是相同的。 这是我使用 StreamReader(Stre
我试图从一个文本文件中读取,该文本文件在写入时有多个输出,但是当我想从我已经输出内容的文本文件中读取时,我想选择最后一个条目(记住每个条目当写作有 5 行时,我只想要包含“密文:”)的行 但是它正在读
我正在开发一个接受TCP连接并读取数据的应用程序,直到读取标记,然后将该数据写入文件系统。我不想断开连接,我想让客户端发送数据来做到这一点,以便他们可以在一个连接中发送多个文件。 我在外部循环中使用了
我尝试制作一个脚本,该脚本可以逐行读取 TXT 文件,并根据里面的内容更改标签。有没有办法检查正在读取哪一行? 最佳答案 此示例使用 StreamReader 类的 ReadLine 方法将文本文件的
我正在尝试处理文本文件的一部分,并使用 UploadFromStream 将文本文件的其余部分写入云 blob。问题在于 StreamReader 似乎从底层流中获取了太多内容,因此后续写入不会执行任
某处是否有非缓冲流读取器实现? 我通过以下方式创建了我的流 FileInputStream inputStream = new FileInputStream(inputFilename); Coun
我想要一个 string[]分配了一个 StreamReader .喜欢: try{ StreamReader sr = new StreamReader("a.txt"); do{
我想弄清楚如何标记文本文件的 StreamReader。我已经能够将这些行分开,但现在我正试图弄清楚如何通过制表符分隔符来分解这些行。这是我目前所拥有的。 string readContents; u
我正在使用我编写的一些不是最佳的代码...:-| 我有以下代码: string fmtLine = ""; string[] splitedFmtLine;
我正在尝试从我的 Web 应用程序的 App_Data 文件夹加载文件: KezMenu kmenu = new KezMenu("~/App_Data/Menu.xml"); 但出于某种原因,这
我正在尝试使用接收 FileStream 的 StreamReader 读取文件的内容。该文件内部有一些空格(字符 32),StreamReader 将它们读取为 0(字符 48)。屏幕截图显示了 F
我有一些奇怪的问题(对我来说)。 有一个应用程序是 Windows 窗体应用程序“firstapp.exe”。还有另一个应用程序也是 Windows 窗体应用程序“launcher.exe”。并且有一
我需要在 C# 应用程序上同时逐行读取四个非常大 (>2 Gb) 的文件。我使用了四种不同的 StreamReader 对象及其 ReadLine() 方法。 同时从四个文件中读取行时,性能会受到严重
我有一个包装在 System.IO.StreamReader 中的输入流...我希望将流的内容写入文件(即 StreamWriter)。 输入流的长度未知。长度可以是几个字节,也可以是千兆字节。 怎么
我对这篇文章有类似的要求... Populate Gridview at runtime using textfile 我想用 StreamReader 读取文本文件并用文件中的数据填充 DataTa
我应该使用哪种编码来读取 æ、Ø、å、ä、ö、ü 等? 最佳答案 您应该使用原始数据的任何编码。你从哪里获取数据,你有关于它的编码的信息吗?如果您尝试使用错误的编码来读取它,您将得到错误的答案:即使您
你好,我在为 Unity3D 编写编辑器时遇到了问题,我遇到了一个问题,我正在从具有常规字符串的 .txt 文件中读取行,然后在每个常规字符串下方读取文件扩展名(代表扩展名的类别) ).当我尝试在分配
这是我的代码: StreamReader reader = new StreamReader("war.txt"); string input = null; while ((input = read
我正在制作一个函数,它将从 StreamReader 中获取行数,不包括注释(以“//”开头的行)和新行。 这是我的代码: private int GetPatchCount(StreamReader
我是一名优秀的程序员,十分优秀!