C# 将内存流对象上传到 Web API
C# Uploading a memorystream object to Web API
我在内存中有一个 CSV 文件,我想将其上传到 Web API。
如果我将 CSV 文件保存到磁盘并上传,它就会被接受。
但是,我想避免额外的工作,并通过简单地上传我拥有的文本作为 MemoryStream 对象(我认为这是正确的格式?)来使代码更清晰。
以下代码适用于上传文件:
string webServiceUrl = "XXX";
string filePath = @"C:\test.csv";
string cred = "YYY";
using (var client = new WebClient()){
client.Headers.Add("Authorization", "Basic " + cred);
byte[] rawResponse = client.UploadFile(webServiceUrl, "POST", filePath);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(rawResponse));
}
如果我有一个包含所有内容的字符串并且我想以相同的方式上传它而不必将其保存到文件中,我该怎么办?
WebClient.UploadData 或者 WebClient.UploadString?
谢谢
编辑:
我试过你所说的,但是使用本地文件(以防字符串有问题),但我得到了同样的错误。
我认为代码将使用您的解决方案
string webServiceUrl = "XXX";
string file = @"C:\test.csv";
string cred = "YYY";
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
byte[] postArray = r.ReadBytes((int)fs.Length);
using (var client = new WebClient())
{
client.Headers.Add("Authorization", "Basic " + cred);
using (var postStream = client.OpenWrite(webServiceUrl, "POST"))
{
postStream.Write(postArray, 0, postArray.Length);
}
}
有什么想法吗?
从 WebClient 使用 OpenWrite()
。
using (var postStream = client.OpenWrite(endpointUrl))
{
postStream.Write(memStreamContent, 0, memStream.Length);
}
如文档所述:
The OpenWrite method returns a writable stream that is used to send data to a resource.
更新
上传前尝试将MemoryStream的位置设为0
memoryStream.Position = 0;
当您将文件复制到 MemoryStream 中时,指针会移动到流的末尾,因此当您随后尝试读取它时,您会得到一个空字节 而不是您的流数据。
MSDN - CopyTo()
Copying begins at the current position in the current stream, and does not reset the position of the destination stream after the copy operation is complete.
终于解决了
首先,我使用有效的 CURL 发出了请求。
我分析了数据包数据并制作了数据包的除外副本。
我做了很多更改,但是,最后的更改是使用我在网上找到的不同功能,它不会使用 "Last-Boundary" 关闭数据包,而 CURL 会。
所以通过修改函数,确保它正确地写了一个 Last-Boundary 它终于起作用了。
此外,另一件重要的事情是将 PreAuthenticate 设置为 true,在线示例没有这样做。
所以,总而言之:
1. 确保数据包构造正确。
2.如果需要认证,一定要预先认证。
webrequest.PreAuthenticate = true;
webrequest.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", cred);
- 如果使用 https(如果您进行身份验证,您可能会这样做),请不要忘记添加 SSL:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
希望这对某人有所帮助。
感谢您之前的帮助!
我在内存中有一个 CSV 文件,我想将其上传到 Web API。
如果我将 CSV 文件保存到磁盘并上传,它就会被接受。
但是,我想避免额外的工作,并通过简单地上传我拥有的文本作为 MemoryStream 对象(我认为这是正确的格式?)来使代码更清晰。
以下代码适用于上传文件:
string webServiceUrl = "XXX";
string filePath = @"C:\test.csv";
string cred = "YYY";
using (var client = new WebClient()){
client.Headers.Add("Authorization", "Basic " + cred);
byte[] rawResponse = client.UploadFile(webServiceUrl, "POST", filePath);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(rawResponse));
}
如果我有一个包含所有内容的字符串并且我想以相同的方式上传它而不必将其保存到文件中,我该怎么办?
WebClient.UploadData 或者 WebClient.UploadString?
谢谢
编辑:
我试过你所说的,但是使用本地文件(以防字符串有问题),但我得到了同样的错误。
我认为代码将使用您的解决方案
string webServiceUrl = "XXX";
string file = @"C:\test.csv";
string cred = "YYY";
FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
byte[] postArray = r.ReadBytes((int)fs.Length);
using (var client = new WebClient())
{
client.Headers.Add("Authorization", "Basic " + cred);
using (var postStream = client.OpenWrite(webServiceUrl, "POST"))
{
postStream.Write(postArray, 0, postArray.Length);
}
}
有什么想法吗?
从 WebClient 使用 OpenWrite()
。
using (var postStream = client.OpenWrite(endpointUrl))
{
postStream.Write(memStreamContent, 0, memStream.Length);
}
如文档所述:
The OpenWrite method returns a writable stream that is used to send data to a resource.
更新
上传前尝试将MemoryStream的位置设为0
memoryStream.Position = 0;
当您将文件复制到 MemoryStream 中时,指针会移动到流的末尾,因此当您随后尝试读取它时,您会得到一个空字节 而不是您的流数据。
MSDN - CopyTo()
Copying begins at the current position in the current stream, and does not reset the position of the destination stream after the copy operation is complete.
终于解决了
首先,我使用有效的 CURL 发出了请求。 我分析了数据包数据并制作了数据包的除外副本。
我做了很多更改,但是,最后的更改是使用我在网上找到的不同功能,它不会使用 "Last-Boundary" 关闭数据包,而 CURL 会。
所以通过修改函数,确保它正确地写了一个 Last-Boundary 它终于起作用了。
此外,另一件重要的事情是将 PreAuthenticate 设置为 true,在线示例没有这样做。
所以,总而言之: 1. 确保数据包构造正确。 2.如果需要认证,一定要预先认证。
webrequest.PreAuthenticate = true;
webrequest.Headers[HttpRequestHeader.Authorization] = string.Format("Basic {0}", cred);
- 如果使用 https(如果您进行身份验证,您可能会这样做),请不要忘记添加 SSL:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
希望这对某人有所帮助。
感谢您之前的帮助!