为什么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()
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);