2013-07-18 15 views
7

Próbuję użyć N-UNIT, aby przetestować moją aplikację web API, ale nie jestem w stanie znaleźć odpowiedniego sposobu na przetestowanie mojej metody przesyłania plików. Jakie byłoby najlepsze podejście do testowania tej metody?Testowanie interfejsu ASP.NET Web API Multipart Form danych Przesyłanie pliku

Web API Kontroler:

[AcceptVerbs("post")] 
public async Task<HttpResponseMessage> Validate() 
    { 
     // Check if the request contains multipart/form-data. 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType,"please submit a valid request"); 
     } 
     var provider = new MultipartMemoryStreamProvider(); // this loads the file into memory for later on processing 
     try 
     { 
      await Request.Content.ReadAsMultipartAsync(provider); 
      var resp = new HttpResponseMessage(HttpStatusCode.OK); 
      foreach (var item in provider.Contents) 
      { 
       if (item.Headers.ContentDisposition.FileName != null) 
       { 
        Stream stream = item.ReadAsStreamAsync().Result; 
     // do some stuff and return response 
        resp.Content = new StringContent(result, Encoding.UTF8, "application/xml"); //text/plain "application/xml" 
        return resp; 
       } 
      } 
       return resp; 
     } 
     catch (System.Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
     } 
    } 

Odpowiedz

3

Po spędzeniu trochę czasu patrząc na WebClient udało mi się wymyślić to:

 try 
     { 
      var imageFile = Path.Combine("dir", "fileName"); 
      WebClient webClient = new WebClient(); 
      byte[] rawResponse = webClient.UploadFile(string.Format("{0}/api/values/", "http://localhost:12345/"), imageFile); 
      Console.WriteLine("Sever Response: {0}", System.Text.Encoding.ASCII.GetString(rawResponse)); // for debugging purposes 
      Console.WriteLine("File Upload was successful"); 
     } 
     catch (WebException wexc) 
     { 
      Console.WriteLine("Failed with an exception of " + wexc.Message); 
      // anything other than 200 will trigger the WebException 

     } 
+0

dlaczego nie używać HttpClient z System.Net.Http? –

+0

Nie sądzę, że HttpClient ma plik przesyłania zaprojektowany specjalnie do przesyłania plików. – Muhammad

17

Na podstawie powyższego komentarza, Oto przykład :

HttpClient client = new HttpClient(); 

MultipartFormDataContent formDataContent = new MultipartFormDataContent(); 
formDataContent.Add(new StringContent("Hello World!"),name: "greeting"); 
StreamContent file1 = new StreamContent(File.OpenRead(@"C:\Images\Image1.jpeg")); 
file1.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
file1.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data"); 
file1.Headers.ContentDisposition.FileName = "Image1.jpeg"; 
formDataContent.Add(file1); 
StreamContent file2 = new StreamContent(File.OpenRead(@"C:\Images\Image2.jpeg")); 
file2.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
file2.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data"); 
file2.Headers.ContentDisposition.FileName = "Image1.jpeg"; 
formDataContent.Add(file2); 

HttpResponseMessage response = client.PostAsync("http://loclhost:9095/api/fileuploads", formDataContent).Result; 

Żądanie przez przewód powinno:

POST http://localhost:9095/api/fileuploads HTTP/1.1 
Content-Type: multipart/form-data; boundary="34d56c28-919b-42ab-8462-076b400bd03f" 
Host: localhost:9095 
Content-Length: 486 
Expect: 100-continue 
Connection: Keep-Alive 

--34d56c28-919b-42ab-8462-076b400bd03f 
Content-Type: text/plain; charset=utf-8 
Content-Disposition: form-data; name=greeting 

Hello World! 
--34d56c28-919b-42ab-8462-076b400bd03f 
Content-Type: image/jpeg 
Content-Disposition: form-data; filename=Image1.jpeg 

----Your Image here------- 
--34d56c28-919b-42ab-8462-076b400bd03f 
Content-Type: image/jpeg 
Content-Disposition: form-data; filename=Image2.jpeg 

----Your Image here------- 
--34d56c28-919b-42ab-8462-076b400bd03f-- 
+0

Szukałem prostego rozwiązania, które może skomplikować wiele rzeczy – Muhammad

+0

Działa świetnie i jest łatwe w obsłudze, dzięki! –

Powiązane problemy