2015-07-24 2 views
2

Я пытаюсь загрузить файл с помощью HTTP Post, но каким-то образом нет файла, который будет найден при обработке запроса на стороне сервера. Я смог создать аналогичный запрос и успешно загрузить файл с помощью расширения Postman для Chrome, но так или иначе не может сделать то же самое программно.Не удается загрузить файл с помощью HTTP POST

код клиента:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fullUrl); 
request.Method = "POST"; 

using (Stream requestStream = request.GetRequestStream()) 
{ 
    string boundary = "----------" + DateTime.Now.Ticks.ToString("x"); 
    byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("--" + boundary + "\r\n"); 
    byte[] trailer = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); 
    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n"; 
    string header = string.Format(headerTemplate, "Files", "myFile.xml", "text/xml"); 
    byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); 
    requestStream.Write(boundarybytes, 0, boundarybytes.Length); 
    requestStream.Write(headerbytes, 0, headerbytes.Length);      
    requestStream.Write(uploadedFile, 0, uploadedFile.Length); 
    requestStream.Write(trailer, 0, trailer.Length); 

}  

Запрос выглядит следующим образом (в Fiddler):

POST https://host/myUrl 
Content-Length: 1067 
Expect: 100-continue 
Connection: Keep-Alive 

------------8d2942f79ab208e 
Content-Disposition: form-data; name="Files"; filename="myFile.xml" 
Content-Type:text/xml 

<myFile> 
    Something 
</myFile> 

------------8d2942f79ab208e 

стороне сервера:

 var httpRequest = HttpContext.Current.Request; 
     if (httpRequest.Files.Count != 1) 
      return BadRequest("Didn't get the file."); 

Но я всегда получаю httpRequest.Files.Count равным нулю. Зачем?

Следующий запрос (созданный с использованием почтового менеджера) дает мне httpRequest.Files.Count как единое целое, как и ожидалось.

POST myUrl HTTP/1.1 
Host: host 
Cache-Control: no-cache 

----WebKitFormBoundaryE19zNvXGzXaLvS5C 
Content-Disposition: form-data; name="Files"; filename="myFile.xml" 
Content-Type: text/xml 


----WebKitFormBoundaryE19zNvXGzXaLvS5C 

Что я делаю неправильно?

ответ

3

Фигурные его. Благодаря этому blog

сделал два изменения:

1) Добавлена ​​ТипСодержимым:

request.ContentType = "multipart/form-data; boundary=" + boundary; 

2) Модифицированный как граница заканчивается

byte[] trailer = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "--"); 

И он работает сейчас. Надеюсь, это поможет кому-то.

0

Возможно, вам необходимо установить тип содержимого запрос на «многочастному/форм-данных»

request.ContentType = "multipart/form-data"; 
+0

Пробовал это, но это не помогло. – NGambit

+0

, возможно, посмотрите на [WebClient.UploadFile] (https://msdn.microsoft.com/library/36s52zhs (v = vs.110) .aspx) и посмотрите, будет ли он работать с вашим требованием –

Смежные вопросы