在流上使用 SeekOrigin.Begin 时不支持指定的方法

And*_*dyP 5 c# streamreader

StreamReader稍后将使用它来反序列化我的请求,如下所示 -

sStream对象 -

using (var reader = new StreamReader(s))
{
    using (var jsonReader = new JsonTextReader(reader))
    {
        var ser = new JsonSerializer();
        return ser.Deserialize<T>(jsonReader);
    }
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但现在我试图在控制台上打印实际的请求正文,所以我尝试这样做,但它给了我一个错误 -

using (var reader = new StreamReader(s))
{
    string body = reader.ReadToEnd();
    // print body on the console which is what I am trying to do
    // reset to start of stream
    // this line gives me error
    s.Seek(0, SeekOrigin.Begin);
    using (var jsonReader = new JsonTextReader(reader))
    {
        var ser = new JsonSerializer();
        return ser.Deserialize<T>(jsonReader);
    }
}
Run Code Online (Sandbox Code Playgroud)

进行此更改后,我收到错误 -Specified method is not supported.我不确定我在这里做错了什么。

注意:这仅用于调试目的,我想在控制台上打印正文。之后我会删除reader.ReadToEnd();东西。

Ste*_*ngs 5

并非所有流都支持查找。Stream 具有这样的CanSeek属性,在本例中可能就是这样false

在这种特定情况下,由于您无论如何都将整个消息读取到字符串中,因此您可以从字符串创建 StringReader 并将其传递到 JsonTextReader 而不是 StreamReader。

在其他情况下,您可能需要寻找不同的解决方案。例如,如果您正在读取 ASP.NET Core 请求流,则可以启用缓冲以允许多次读取该流