C# 为什么MemoryStream构造函数需要Int?

C# 为什么MemoryStream构造函数需要Int?,c#,memorystream,C#,Memorystream,根据为err msg提供的解决方案,我在根级别获取的数据无效。第1行,位置1-更多关于我的工作经历都有文档记录,我尝试更改服务器代码,如下所示: public async void SendInventoryXML(String userId, String pwd, String fileName) { XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync()); String saveLo

根据为err msg提供的解决方案,我在根级别获取的数据无效。第1行,位置1-更多关于我的工作经历都有文档记录,我尝试更改服务器代码,如下所示:

public async void SendInventoryXML(String userId, String pwd, String fileName)
{
    XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
    String saveLoc = String.Format(@"C:\HDP\{0}.xml", fileName);
    doc.Save(saveLoc);
}
……为此:

public async void SendInventoryXML(String userId, String pwd, String fileName)
{
    MemoryStream ms = new MemoryStream(await Request.Content.ReadAsStreamAsync());
    ms.Flush();
    ms.Position = 0;

    XDocument doc = XDocument.Load(ms);
    String saveLoc = String.Format(@"C:\HDP\{0}.xml", fileName);
    doc.Save(saveLoc);
}
…但是get,参数1:无法从'System.IO.Stream'转换为'int',并且与'System.IO.MemoryStream.MemoryStream'匹配的最佳重载方法具有一些无效参数


为什么MemoryStream希望int作为arg?它是否真的需要字节数组或类似的东西?

MemoryStream支持多种构造函数,而不仅仅是一个需要int的构造函数:

MemoryStream()
MemoryStream(Byte[])
MemoryStream(Int32)
MemoryStream(Byte[], Boolean)
MemoryStream(Byte[], Int32, Int32)
MemoryStream(Byte[], Int32, Int32, Boolean)
MemoryStream(Byte[], Int32, Int32, Boolean, Boolean)
请参阅MSDN,以了解每一项的完整说明:

但是,您可以使用现有流实例,但您可以使用Stream.CopyTo和Stream.CopyToAsync方法来执行基于异步的代码,这些代码将从一个流复制到另一个流,例如:

var in_stream = await Request.Content.ReadAsStreamAsync();
var out_stream = new MemoryStream();

await in_stream.CopyToAsync(out_stream);
在您的代码示例中,您可以直接从输入流中读取数据,在这种情况下,使用MemoryStream似乎是多余的:

XDocument doc = XDocument.Load(in_stream);

我还应该指出,您永远不需要在MemoryStream实例上调用Flush,调用是完全冗余的,因为数据会立即写入备份字节[]。

您不能将流作为源提供给MemoryStream,如果要将流复制到内存中,则需要创建一个空内存流,然后执行复制

public async void SendInventoryXML(String userId, String pwd, String fileName)
{
    var stream = await Request.Content.ReadAsStreamAsync()
    MemoryStream ms = new MemoryStream();
    await stream.CopyToAsync(ms);
    //ms.Flush(); Not needed, Flush does nothing in MemoryStream. See: http://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs
    ms.Position = 0;

    XDocument doc = XDocument.Load(ms);
    String saveLoc = String.Format(@"C:\HDP\{0}.xml", fileName);
    doc.Save(saveLoc);
}

你最好这样使用它:

var httpStream = await Request.Content.ReadAsStreamAsync();
MemoryStream ms = new MemoryStream();
httpStream.CopyTo(ms);

是的,您可以向它传递一个字节数组。但看起来你是在给它一个任务。也许像这样未经测试的代码可以从以下位置复制:


你读过那本书吗?要是有就好了!不要标记垃圾邮件。所有这些都与编译器错误和API使用问题无关,而这些问题通常被问及。MemoryStream不是多余的吗,即您可以直接从源流加载文档?当您有需要作为流处理的字节时,而不是当您已经有流时,MemoryStream非常有用。或者,如果需要中间形式的存储,请将第一个流读入字节数组。这看起来像cargo cult编程,请尝试在链接问题的答案中理解使用memorystream的原因。True。但这些都不接受流,也不帮助OP:无法从“System.IO.Stream”转换为“int”。在这种情况下,似乎可以简单地消除MemoryStream,因为它从未写入,并且已经有一个流。@user2864740是的,它可以,但是你会看到OP在他的第一个代码示例中发布了原始代码,他说它不起作用;文本编码或其中的数据不是流的固有部分。@user2864740不,不会,但这不是本问题的主题。这将使代码正常工作,这样他就可以再次获得原始错误,并继续他的调试过程。修复是真正的问题。虽然这确实说明了一个解决方案,但创建一个新的MemoryStream是不需要的。这是一个无用的字节浪费,因为流从未写入,也不会修复其他问题。实际上,你是对的,但是@b-clay-shannon需要从一些东西开始。这是对我现有代码的改进,因为它现在可以从Fiddler Composer和我的Winforms应用程序中使用。现在,为了让它正常工作,我从.NET史前1.1中的手持设备推断,客户端代码有问题。请点击Winforms应用程序中的这一部分;它只适用于小提琴手作曲家。不过,我仍然认为这段代码更好——我只需要让它从手持客户端代码开始工作。如果使用wait,则不需要任务代码,因为此方法标记为异步。在这种情况下,他可以等待ReadAsStreamAsync,然后CopyToAsync同步到FileStream实例。
public async void SendInventoryXML(String userId, String pwd, String fileName)
{
    Task task = Request.Content.ReadAsStreamAsync().ContinueWith(t =>
    {
        var stream = t.Result;
        using (FileStream fileStream = File.Create(String.Format(@"C:\HDP\{0}.xml", fileName), (int) stream.Length)) 
        {
            byte[] bytesInStream = new byte[stream.Length];
            stream.Read(bytesInStream, 0, (int) bytesInStream.Length);
            fileStream.Write(bytesInStream, 0, bytesInStream.Length);
        }
    });
}