2012-02-15 13 views
12

Qual è il modo migliore per caricare un file per un client REST?Caricamento file REST con HttpRequestMessage o Stream?

Dalla documentazione WCF Web API

[WebInvoke(UriTemplate = "thumbnail", Method = "POST")] 
public HttpResponseMessage UploadFile(HttpRequestMessage request) 
{ 

dai post multipli forum:
WCF REST File upload with additional parameters

[WebGet(UriTemplate="", Method ="POST"] 
public string UploadFile(Stream fileContents) 

ho capito, che il primo metodo consente di inviare direttamente un file da un form HTML normale . Il secondo approccio sembra più comune su tutti i post del forum che trovo.

Cosa consiglieresti e perché? L'API REST dovrebbe essere accessibile da tutti i tipi di linguaggi e piattaforme.

Per l'approccio HttpRequestMessage, come faccio a caricare un file preferibile con HttpClient WCF? Con FormUrlEncodedMediaTypeFormatter)

risposta

2

Il primo metodo è "più vicino al metallo" e sarebbe più flessibile poiché si elaborano le richieste http e si creano le risposte da soli. Se tutto quello che devi fare è accettare un flusso da un client, la seconda opzione è molto più semplice dal punto di vista dell'implementazione (sotto il cofano, fa lo stesso lavoro che sta facendo il primo metodo)

Non ho una risposta per la tua ultima domanda.

12

Al fine di testare l'approccio HttpRequestMessage ho fatto quanto segue usando MVC:

vista
public class TestingController : Controller 
{ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Upload() 
    { 
     var file = Request.Files[0]; 
     var filename = Request.Form["filename"]; 
     var uri = string.Format("http://yoururl/serviceRoute/{0}", filename); 
     var client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("image/pjpeg")); 
     var content = new StreamContent(file.InputStream); 
     var response = client.PostAsync(uri, content); 
     ViewBag.ServerUri = uri; 
     ViewBag.StatusCode = response.Result.StatusCode.ToString(); 
     return View(); 
    } 

} 

l'indice dovrebbe avere una forma in essa che i posti posteriori al metodo di caricamento. Quindi è possibile utilizzare HttpClient per stabilire una connessione al servizio REST.

+0

Grazie Jed, sfortunatamente posso scegliere solo una risposta giusta e l'ho già data a JCaffeine. Ma ha fatto un voto in su. – Remy

+0

Remy, sei il benvenuto e non preoccuparti. Sono contento che ti abbia aiutato. – Jed