2017-02-24 2 views
0

既存のWeb APIにスワッガーインターフェイスを実装しています。現在のAPIコントローラーは、Request.Contentを使用して非同期に画像を転送する非同期アップロード機能を公開しています。使用されたコードは、thisの記事で説明されています。HTTPコンテンツを使用したAPIファイルのアップロード

マイAPIコントローラ:

[HttpPost] 
    [Route("foo/bar/upload")] 
    public async Task<HttpResponseMessage> Upload() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 
     var provider = await Request.Content.ReadAsMultipartAsync(new InMemoryMultipartFormDataStreamProvider()); 
     NameValueCollection formData = provider.FormData; 
     HttpResponseMessage response; 
     //access files 
     IList<HttpContent> files = provider.Files; 
     if (files.Count > 0) 
     { 
      HttpContent file1 = files[0]; 
      using (Stream input = await file1.ReadAsStreamAsync()) 
      { 
       object responseObj = ExternalProcessInputStream(input) 
       response = Request.CreateResponse(HttpStatusCode.OK, responseObj); 
      } 
     } 
     else 
     { 
      response = Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 
     return response; 
    } 

これはダンディ動作しますが、私は闊歩を介してこれを公開するとき、私は使用したときにエラーを返すパラメータのない機能を持っています。

私の質問は、このメソッドをテストするための適切な値をどのように供給できるかです。

答えて

2

これを処理するには、カスタムIOperationFilterを追加する必要があります。

​​

とIn:あなたは、その後のようなあなたの関数にファイルアップロードパラメータを追加するSwashbuckle.Swagger.IOperationFilterを作成する必要が

[ValidateMimeMultipartContentFilter] 
    [HttpPost, Route("softwarepackage")] 
    public Task<SoftwarePackageModel> UploadSingleFile() 
    { 

     var streamProvider = new MultipartFormDataStreamProvider(ServerUploadFolder); 
     var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<SoftwarePackageModel>(t => 
     { 
      var firstFile = streamProvider.FileData.FirstOrDefault(); 

      if (firstFile != null) 
      { 
       // Do something with firstFile.LocalFileName 
      } 

      return new SoftwarePackageModel 
      { 

      }; 
     }); 

     return task; 
    } 

:あなたがそうのようなコントローラを持って考えると

Swagger設定でフィルタを登録する必要があります:

config.EnableSwagger(c => {... c.OperationFilter<FileOperationFilter>(); ... }); 

o FilterAttributeを追加してMultipartコンテンツを除外しました。

public class ValidateMimeMultipartContentFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (!actionContext.Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 
    } 

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 

    } 

} 
+0

フィルタが追加されました。 – martijn

関連する問題