2014-01-16 2 views
3

Я пытаюсь отправить один или несколько файлов (.doc) в службу ASP.NET Web API 2 и вернуть измененную версию (.docx). Я могу отправить файл и получить ответ, но HttpContentMultipartExtensions, которые я использовал в службе HTTPContent в запросе, не доступны на клиенте для использования в ответе. Это что-то, что не доступно из коробки, которое может быть подключено, или это неправильное использование multipartform?Web API POST MultipartFormDataContent: Может ли ответ возвращать многоформатное содержимое?

Есть два приложения: клиент и Web API службы MVC:

Контроллер для клиента (читает файлы примеров из App_Data, POST в serviceserver/API/mpformdata):

public async Task<ActionResult> PostMpFormData() 
{ 
    DirectoryInfo dir = new DirectoryInfo(Server.MapPath(@"~\App_Data")); 
    var files = dir.GetFiles().ToList(); 

    using (HttpClient client = new HttpClient()) 
    { 
     HttpResponseMessage result = new HttpResponseMessage(); 
     using (MultipartFormDataContent mpfdc = new MultipartFormDataContent()) 
     { 
      foreach (var file in files) 
      { 
       mpfdc.Add(new StreamContent(file.OpenRead()), "File", file.Name); 
      } 

      var requestUri = ConfigurationManager.AppSettings["DocumentConverterUrl"] + "/api/mpformdata"; 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("multipart/form-data")); 
      result = client.PostAsync(requestUri, mpfdc).Result; 
     } 

     ViewBag.ResultStatusCode = result.StatusCode; 
     ViewBag.ContentLength = result.Content.Headers.ContentLength; 

     // Fiddler show that it returns multipartform content, but how do I use it? 
     // var resultContent = result.Content; 
    } 

    return View(); 
} 

контроллера для Web сервис API:

public class UploadController : ApiController 
{ 
    [HttpPost, Route("api/mpformdata")] 
    public async Task<HttpResponseMessage> PostMpFormData() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 
     return await UseMultipartFormDataStream(); 
    } 

    private async Task<HttpResponseMessage> UseMultipartFormDataStream() 
    { 
     string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
     var provider = new MultipartFormDataStreamProvider(root); 
     MultipartFormDataContent mpfdc = new MultipartFormDataContent(); 

     try 
     { 
      await Request.Content.ReadAsMultipartAsync(provider); 

      foreach (MultipartFileData file in provider.FileData) 
      { 
       var filename = file.Headers.ContentDisposition.FileName; 
       Trace.WriteLine(filename); 
       Trace.WriteLine("Server file path: " + file.LocalFileName); 
       mpfdc.Add(new ByteArrayContent(File.ReadAllBytes(file.LocalFileName)), "File", filename); 
      } 
      var response = Request.CreateResponse();  
      response.Content = mpfdc; 
      response.StatusCode = HttpStatusCode.OK; 
      return response; 
     } 
     catch (System.Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
     } 
    } 
} 
+1

Почему вы не используете 'ReadAsMultipartAsync' на клиенте? –

+0

HttpContentMultipartExtensions, включая ReadAsMultipartAsync, недоступны в HttpResponseMessage. Они доступны только в HttpRequestMessage. –

+0

Это неверно ... эти расширения находятся на 'HttpContent', и вы должны быть способны выполнить ответ. Контент.ReadAsMultipartAsync' –

ответ

5

Составные расширения являются частью System.Net.Http.Formatting DLL. Убедитесь, что у вас установлен пакет nuget Microsoft.AspNet.WebApi.Client.

+0

Удивительный! Благодаря! –

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