使用WebRequest(C#)发送数据和文件

时间:2012-12-04 20:07:32

标签: c# curl stream webrequest

我想使用WebRequest发送数据和文件。

byte[] fileStream = File.ReadAllBytes(path);

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });

WebRequest request = WebRequest.Create(url);

request.ContentType = "application/json";
request.Method = "POST";
request.Credentials = new NetworkCredential("name", "pw");

Stream dataStream = request.GetRequestStream();
dataStream.Write(Encoding.UTF8.GetBytes(data), 0, Encoding.UTF8.GetBytes(data).Length);
//dataStream.Write(fileStream, 0, fileStream.Length);

dataStream.Write(fileStream, 0, fileStream.Length); //CAUSES A CRASH
dataStream.Close();
WebResponse response = request.GetResponse();

如果我包含" dataStream.Write(fileStream,0,fileStream.Length),我不知道它失败的原因;"行服务器无法接受我的流,说有一个内部错误。 我有一个工作的CURL命令向我显示服务器想要的数据。

curl -k -X POST -u name:pw -H "Content-type: application/json"
-H 'Accept:application/json''url'
-d'{parameters}'
--data-binary @file.wav

如果我排除了提到的行,该命令按预期工作,告诉我没有输入文件。所以我认为file.wav

可能有问题

1 个答案:

答案 0 :(得分:1)

该代码将写入一些JSON格式的数据,紧接着是file.wav的原始字节。这很可能不是接收服务器所期望的。通常,如果要同时发送文件和数据,则应使用MIME多部分编码。 curl可能会自动为您执行此操作。通过连接调试代理(如Fiddler)并观察curl实际发送的内容来确认该假设是很好的。然后尝试在C#中模拟它。

如果确实需要发送多部分消息,那么了解您正在使用的.NET框架版本会很有帮助。在某些较新版本中,有更简单的方法可以执行此操作。