2015-06-23 9 views
5

में पुट क्रिया का उपयोग कर फ़ाइल अपलोड करें मैं फ़ाइलों को अपलोड करने के लिए HTTP PUT क्रिया का उपयोग करके एक एएसपी.Net वेब एपीआई 2 क्रिया का खुलासा करना चाहता हूं। यह हमारे आरईएसटी मॉडल के साथ सुसंगत है क्योंकि एपीआई एक रिमोट फाइल सिस्टम (वेबडावी के समान है, लेकिन वास्तव में सरलीकृत) का प्रतिनिधित्व करता है, इसलिए ग्राहक संसाधन नाम चुनता है (इस प्रकार PUT आदर्श है और POST एक तार्किक विकल्प नहीं है)।एएसपी.Net वेब एपीआई 2

वेब एपीआई दस्तावेज how to upload files using multipart/form-data forms का वर्णन करता है, लेकिन यह वर्णन नहीं करता कि PUT विधियों का उपयोग करके इसे कैसे किया जाए।

आप इस तरह के एपीआई (एचटीएमएल मल्टीपार्ट फॉर्म पुट क्रियाओं की अनुमति नहीं देते) का परीक्षण करने के लिए क्या उपयोग करेंगे? सर्वर कार्यान्वयन the web api documentation में वर्णित (MultipartStreamProvider का प्रयोग करके) बहुखण्डीय कार्यान्वयन की तरह लग रहे हैं, या यह इस तरह दिखना चाहिए:

[HttpPut] 
public async Task<HttpResponseMessage> PutFile(string resourcePath) 
{ 
    Stream fileContent = await this.Request.Content.ReadAsStreamAsync(); 
    bool isNew = await this._storageManager.UploadFile(resourcePath, fileContent); 
    if (isNew) 
    { 
     return this.Request.CreateResponse(HttpStatusCode.Created); 
    } 
    else 
    { 
     return this.Request.CreateResponse(HttpStatusCode.OK); 
    } 
} 

उत्तर

8

यह सर्वर-साइड कोड मैं एक उदाहरण के रूप तैनात लगता है कुछ परीक्षण करने के बाद सही है ।

using (var fileContent = new FileStream(@"C:\temp\testfile.txt", FileMode.Open)) 
using (var client = new HttpClient()) 
{ 
    var content = new StreamContent(fileContent); 
    content.Headers.ContentType = new MediaTypeHeaderValue("text/plain"); 
    client.BaseAddress = new Uri("http://localhost:81"); 
    HttpResponseMessage response = 
     await client.PutAsync(@"/api/storage/testfile.txt", content); 
} 
+1

यह होगा:

[HttpPut] [Route(@"api/storage/{*resourcePath?}")] public async Task<HttpResponseMessage> PutFile(string resourcePath = "") { // Extract data from request Stream fileContent = await this.Request.Content.ReadAsStreamAsync(); MediaTypeHeaderValue contentTypeHeader = this.Request.Content.Headers.ContentType; string contentType = contentTypeHeader != null ? contentTypeHeader.MediaType : "application/octet-stream"; // Save the file to the underlying storage bool isNew = await this._dal.SaveFile(resourcePath, contentType, fileContent); // Return appropriate HTTP status code if (isNew) { return this.Request.CreateResponse(HttpStatusCode.Created); } else { return this.Request.CreateResponse(HttpStatusCode.OK); } } 

एक साधारण सांत्वना अनुप्रयोग (वेब ​​एपीआई क्लाइंट लाइब्रेरी का उपयोग करके) यह परीक्षण करने के लिए पर्याप्त है: यहाँ एक उदाहरण, किसी भी प्रमाणीकरण/प्राधिकरण/त्रुटि हैंडलिंग कोड से बाहर छीन लिया है एक HTTP सर्वर चलाने पर भरोसा करने के बजाय, इसके लिए एक उचित इकाई परीक्षण कैसे लिखना दिलचस्प है। – James

+0

मुझे यह काम करने में बहुत परेशानी थी क्योंकि मुझे 404 त्रुटियां मिल रही थीं। बाहर निकलता है आपको '{filename}' {file}} के फ़ाइल नामों को स्वीकार करने के लिए web.config को बदलने की आवश्यकता हो सकती है। {Extension} '। विवरण के लिए यह स्टैक ओवरफ्लो प्रश्न देखें: http://stackoverflow.com/questions/20998816/dot-character-in-mvc-web-api-2-for-request-such-as-api-people-staff-45287 –

संबंधित मुद्दे