Cómo enviar archivos zip a ASP.NET WebApi

Me pregunto cómo puedo enviar un archivo zip a un controlador WebApi y viceversa. El problema es que mi WebApi usa json para transmitir datos. Un archivo zip no es serializable, tampoco es una secuencia. Una cadena sería serializable. Pero tiene que haber otra solución que no sea convertir el zip en una cadena y luego enviar la cadena. Eso suena mal.

¿Alguna idea de cómo se hace esto?

Si su método API espera un HttpRequestMessage entonces puede extraer la secuencia de eso:

 public HttpResponseMessage Put(HttpRequestMessage request) { var stream = GetStreamFromUploadedFile(request); // do something with the stream, then return something } private static Stream GetStreamFromUploadedFile(HttpRequestMessage request) { // Awaiting these tasks in the usual manner was deadlocking the thread for some reason. // So for now we're invoking a Task and explicitly creating a new thread. // See here: http://stackoverflow.com/q/15201255/328193 IEnumerable parts = null; Task.Factory .StartNew(() => parts = request.Content.ReadAsMultipartAsync().Result.Contents, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default) .Wait(); Stream stream = null; Task.Factory .StartNew(() => stream = parts.First().ReadAsStreamAsync().Result, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default) .Wait(); return stream; } 

Esto funciona para mí cuando enctype="multipart/form-data" un formulario HTTP con enctype="multipart/form-data" .

Intente usar un simple HttpResponseMessage, con un StreamContent dentro para GET, descargar el archivo

 public HttpResponseMessage Get() { var path = @"C:\Temp\file.zip"; var result = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(path, FileMode.Open); result.Content = new StreamContent(stream); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "file.zip" }; return result; } 

y para POST, subir archivo

 public Task Post() { HttpRequestMessage request = this.Request; if (!request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } var provider = new MultipartFormDataStreamProvider("C:\Temp"); var task = request.Content.ReadAsMultipartAsync(provider). ContinueWith(o => { string file1 = provider.BodyPartFileNames.First().Value; // this is the file name on the server where the file was saved return new HttpResponseMessage() { Content = new StringContent("File uploaded.") }; } ); return task; }