为什么MemoryStream构造函数需要Int

本文关键字:Int 构造函数 MemoryStream 为什么 | 更新日期: 2023-09-27 18:20:46

基于这里为我得到的错误消息提供的解决方案("根级别的数据无效。第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(int)"匹配的最佳重载方法具有一些无效参数"

为什么MemoryStream需要一个int作为arg?它不是真的想要一个字节数组或类似的东西吗?

为什么MemoryStream构造函数需要Int

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以获得每种的完整描述

http://msdn.microsoft.com/en-us/library/system.io.memorystream.memorystream(v=vs.110).aspx

然而,不采用现有的Stream实例,但您可以使用方法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(),该调用是完全冗余的,因为无论如何,数据都会立即写入支持byte[]

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

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);
}

是的,您可以向它传递一个字节数组。但看起来你是在给它传递一个任务。也许像这样(未经测试)的代码可以工作(复制自:使用系统线程任务):

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);
        }
    });
}

你最好这样使用它:

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