2013-11-22 9 views
9

भेजा जा रहा है एक वेब api विधि में मैं एक फ़ाइल पैदा करने और उसके बाद तोवेब एपीआई - कैसे पता लगाने के लिए जब एक प्रतिक्रिया

public async Task<HttpResponseMessage> GetFile() { 
    FileInfo file = generateFile(); 
    var msg = Request.CreateResponse(HttpStatusCode.OK); 

    msg.Content = new StreamContent(file.OpenRead()); 
    msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
    msg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {FileName = file.Name}; 

    return msg; 
} 

तरह जवाबी कार्रवाई के लिए यह स्ट्रीमिंग रहा हूँ क्योंकि यह एक उत्पन्न फ़ाइल मैं चाहता हूँ समाप्त हो गया है प्रतिक्रिया समाप्त होने के बाद इसे हटाएं लेकिन मुझे इसके लिए पाइपलाइन में एक हुक नहीं लग रहा है।

मुझे लगता है कि मैं एक स्थिर में फ़ाइल का संदर्भ डाल सकता हूं और एक कस्टम संदेश हैडलर स्थापित कर सकता हूं जो इस स्थिर स्थिर चर और हटाए गए मूल्यों से मूल्य खींचता है। हालांकि, ऐसा लगता है कि यह स्थैतिक उपयोग के कारण संभवतः दोनों सही नहीं हो सकता है (जब यह सभी प्रति अनुरोध होना चाहिए) और क्योंकि मुझे एक अलग मार्ग पंजीकृत करना होगा।

मैंने this question देखा है, लेकिन ऐसा लगता है कि वास्तव में बहुत उपयोगी प्रतिक्रिया नहीं है।

उत्तर

10

अच्छा परिदृश्य! ... संदेश संचालकों का उपयोग कर के साथ समस्या यह है कि प्रतिक्रिया लेखन मेजबान परतों में और नीचे दिए गए संदेश संचालकों परत होता है, तो वे आदर्श नहीं हैं ...

के बाद आप कैसे का एक उदाहरण है है यह कर सकता है:

msg.Content = new CustomStreamContent(generatedFilePath); 

public class CustomStreamContent : StreamContent 
{ 
    string filePath; 

    public CustomStreamContent(string filePath) 
     : this(File.OpenRead(filePath)) 
    { 
     this.filePath = filePath; 
    } 

    private CustomStreamContent(Stream fileStream) 
     : base(content: fileStream) 
    { 
    } 

    protected override void Dispose(bool disposing) 
    { 
     //close the file stream 
     base.Dispose(disposing); 

     try 
     { 
      File.Delete(this.filePath); 
     } 
     catch (Exception ex) 
     { 
      //log this exception somewhere so that you know something bad happened 
     } 
    } 
} 

वैसे, आप यह फ़ाइल उत्पन्न क्योंकि आप पीडीएफ में कुछ डेटा परिवर्तित कर रहे हैं कर रहे हैं। यदि हां, तो मुझे लगता है कि आप इस उद्देश्य के लिए सीधे प्रतिक्रिया डेटा में परिवर्तित डेटा लिखकर PushStreamContent का उपयोग कर सकते हैं। इस तरह आपको पहले फ़ाइल बनाने की आवश्यकता नहीं है और फिर बाद में इसे हटाने की चिंता करें।

+0

धन्यवाद किरण, मैं इस तरह कुछ सजावट पैटर्न के साथ ऐसा करने की कोशिश कर रहा था और अपने बालों को खींच रहा था क्योंकि मैं सिर्फ प्रकाशनों को ओवरराइड नहीं कर सका। उस नोट पर (और जब से आप वेब एपी पर काम करते हैं) किसी भी मौके पर हम भविष्य में इंटरफेस पर आधारित एचटीपीकंटेंट प्राप्त कर सकते हैं? –

+0

और हाँ, मैं एक पीडीएफ उत्पन्न कर रहा हूं, लेकिन इसे phantomjs के लिए खोलकर कर रहा हूं, इसलिए फ़ाइल मेरा मूल इंटरचेंज प्रारूप है, दुर्भाग्यवश 'स्ट्रीम' –

0

हमने वेबएपीआई में एक ही कार्रवाई की। फ़ॉर्म फ़ाइल डाउनलोड करने के बाद मुझे फ़ाइल को हटाना होगा। हम कस्टम प्रतिक्रिया संदेश वर्ग बना सकते हैं। यह पैरामीटर के रूप में फ़ाइल पथ लेता है और इसे प्रसारित करने के बाद इसे हटा देता है।

public class FileResponseMessage : HttpResponseMessage 
    { 
     private readonly string _filePath; 

     public FileHttpResponseMessage(string filePath) 
     { 
      this._filePath= filePath; 
     } 

     protected override void Dispose(bool disposing) 
     { 
      base.Dispose(disposing); 
      Content.Dispose(); 
      File.Delete(_filePath); 
     } 
    } 

इस वर्ग का उपयोग नीचे कोड के रूप में करें और प्रतिक्रिया स्ट्रीम पर लिखा जाने पर यह आपकी फ़ाइल को हटा देगा।

var response = new FileResponseMessage(filePath); 
response.StatusCode = HttpStatusCode.OK; 
response.Content = new StreamContent(new FileStream(filePath, FileMode.Open, FileAccess.Read)); 
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
{ 
    FileName = "MyReport.pdf" 
}; 
return response; 
+0

नहीं, आपको = सही तरीके से निपटान करते समय निपटान विधि में कोड निष्पादित करना चाहिए। अन्यथा आपको समस्याएं होंगी। –

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