1

我想使用 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可能有问题

4

1 回答 1

1

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

如果您确实需要发送多部分消息,那么了解您使用的 .NET 框架的版本会很有帮助。在一些较新的版本中有更简单的方法来做到这一点。

于 2012-12-04T20:19:47.527 回答