2013-07-18 38 views
7

我正在尝试使用N-UNIT来测试我的Web API应用程序,但我无法找到正确的方式来测试我的文件上传方法。哪种测试方法最好?测试ASP.NET Web API多部分表单数据文件上传

的Web API控制器:

[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); 
     } 
    } 

回答

3

花了一些时间寻找到的WebClient我能想出这个后:

 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

为什么不使用从System.Net.Http HttpClient? –

+0

我不认为HttpClient有专门为文件上传设计的上传文件。 – Muhammad

17

根据您的上述评论,下面是一个例子:

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; 

请求通过电汇会想︰

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

我正在寻找一个简单的解决方案,这可能会使很多事情变得复杂 – Muhammad

+0

它工作的很好,它的易于处理,谢谢! –

相关问题