C#.NET HttpWebClient可以';不能让文件上传工作;故障排除提示?

C#.NET HttpWebClient可以';不能让文件上传工作;故障排除提示?,.net,file-upload,httpwebrequest,.net,File Upload,Httpwebrequest,我需要使用HttpWebClient一次上传一系列文件 我遵循此线程上的示例代码: 正如一些人在该线程上报告的那样,我也收到了HTTP状态500错误。我已经尝试了线程中提供的两种解决方案,但都不适合我。请求中的间距似乎存在一些问题,但我一直无法解决 问题: 我应该使用什么资源来验证HTTP请求的格式是否正确 如果我复制并粘贴文件部分,应该可以手动写入请求,对吗 如果你知道一些有效的示例代码,请让我知道 以下是我正在使用的代码: public static void UploadFilesT

我需要使用HttpWebClient一次上传一系列文件

我遵循此线程上的示例代码:

正如一些人在该线程上报告的那样,我也收到了HTTP状态500错误。我已经尝试了线程中提供的两种解决方案,但都不适合我。请求中的间距似乎存在一些问题,但我一直无法解决

问题:

  • 我应该使用什么资源来验证HTTP请求的格式是否正确

  • 如果我复制并粘贴文件部分,应该可以手动写入请求,对吗

  • 如果你知道一些有效的示例代码,请让我知道

  • 以下是我正在使用的代码:

     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}";