C#.NET HttpWebClient可以';不能让文件上传工作;故障排除提示?
我需要使用HttpWebClient一次上传一系列文件 我遵循此线程上的示例代码: 正如一些人在该线程上报告的那样,我也收到了HTTP状态500错误。我已经尝试了线程中提供的两种解决方案,但都不适合我。请求中的间距似乎存在一些问题,但我一直无法解决 问题:C#.NET HttpWebClient可以';不能让文件上传工作;故障排除提示?,.net,file-upload,httpwebrequest,.net,File Upload,Httpwebrequest,我需要使用HttpWebClient一次上传一系列文件 我遵循此线程上的示例代码: 正如一些人在该线程上报告的那样,我也收到了HTTP状态500错误。我已经尝试了线程中提供的两种解决方案,但都不适合我。请求中的间距似乎存在一些问题,但我一直无法解决 问题: 我应该使用什么资源来验证HTTP请求的格式是否正确 如果我复制并粘贴文件部分,应该可以手动写入请求,对吗 如果你知道一些有效的示例代码,请让我知道 以下是我正在使用的代码: public static void UploadFilesT
public static void UploadFilesToRemoteUrl(string url, string[] files,
string logpath, NameValueCollection nvc)
{
long length = 0;
string boundary = "----------------------------" +
DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest2 = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest2.ContentType = "multipart/form-data; boundary=" +
boundary;
httpWebRequest2.Method = "POST";
httpWebRequest2.KeepAlive = true;
httpWebRequest2.Credentials =
System.Net.CredentialCache.DefaultCredentials;
Stream memStream = new System.IO.MemoryStream();
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" +
boundary + "\r\n");
string formdataTemplate = "\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
foreach (string key in nvc.Keys)
{
string formitem = string.Format(formdataTemplate, key, nvc[key]);
byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
memStream.Write(formitembytes, 0, formitembytes.Length);
}
memStream.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";
for (int i = 0; i < files.Length; i++)
{
//string header = string.Format(headerTemplate, "file" + i, files[i]);
string header = string.Format(headerTemplate, "uplTheFile", files[i]);
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
memStream.Write(headerbytes, 0, headerbytes.Length);
FileStream fileStream = new FileStream(files[i], FileMode.Open,
FileAccess.Read);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
memStream.Write(boundarybytes, 0, boundarybytes.Length);
fileStream.Close();
}
httpWebRequest2.ContentLength = memStream.Length;
Stream requestStream = httpWebRequest2.GetRequestStream();
memStream.Position = 0;
byte[] tempBuffer = new byte[memStream.Length];
memStream.Read(tempBuffer, 0, tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer, 0, tempBuffer.Length);
requestStream.Close();
WebResponse webResponse2 = httpWebRequest2.GetResponse();
Stream stream2 = webResponse2.GetResponseStream();
StreamReader reader2 = new StreamReader(stream2);
MessageBox.Show(reader2.ReadToEnd());
webResponse2.Close();
httpWebRequest2 = null;
webResponse2 = null;
}
第一个\r\n不应该在那里。此外,在标题或边界的末尾不应出现双新行(\r\n)。您应该使用来验证您的程序发送的内容是否与手动发送的内容相同。谢谢您的回答。我在用小提琴。我已尝试手动修改请求,但仍然失败。谢谢,ck。我一直与fiddler合作,最终找到了一种获得正确原始请求的方法。我将在稍后的更新文章中解释,一旦我确认了我的假设。我使用WebClient编写了一个简单的、可扩展的多部分MIME上传程序。这是:
string formdataTemplate = "\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";