2017-05-07 20 views
5

में आंतरिक HttpClient कॉल से कुशलता से आगे की सामग्री को मैं अपने एएसपी.NET कोर ऐप से एक आंतरिक HTTP सेवा कॉल कर रहा हूं। इस सेवा से प्रतिक्रिया संदेश बहुत बड़े हो सकते हैं, इसलिए मैं उन्हें यथासंभव कुशलता से आगे बढ़ाना चाहता हूं। यदि संभव हो तो मैं कंट्रोलर प्रतिक्रिया में सामग्री को "मानचित्र" करना चाहता हूं - या दूसरे शब्दों में "सेवा से आने वाली स्ट्रीम को मेरे नियंत्रक से बाहर जाने वाली धारा में पाइप करें"।ASP.NET कोर

मेरे नियंत्रक विधि अब तक बस सेवा कॉल:

[HttpPost] 
public Post([FromBody]SearchQuery searchQuery) 
{ 
    var response = _searchClient.Search(searchQuery); 
    // ? 
} 

सेवा एक HttpClient उदाहरण द्वारा कहा जाता है। यहाँ (एक उदाहरण के रूप में) मैं सिर्फ HttpContent लौटने के लिए, लेकिन निश्चित रूप से मैं पूरी तरह से पढ़ सकते हैं और धारावाहिक शरीर (जो मैं स्पष्ट रूप से नहीं चाहते हैं) लौट सकता है:

public async Task<HttpContent> Search(SearchQuery searchQuery) 
{ 
    var content = new StringContent(TsearchQuery, Encoding.UTF8, "application/json"); 
    var response = await _httpClient.PostAsync("_search", content); 
    return response.Content; 
} 

यह कुशल और तेजी से सामग्री वापस जाने के लिए है ? प्रतिक्रिया के लिए मैं अपने नियंत्रक विधि में सामग्री कैसे पास करूं? क्या एएसपी.नेट कोर नीचे धाराएं बनाता है? या क्या मुझे अपने कोड में धाराओं को स्पष्ट रूप से संभालना चाहिए?

उत्तर

4

आप कार्रवाई से Stream वापस कर सकते हैं और एएसपी.नेट कोर एमवीसी कुशलतापूर्वक इसे प्रतिक्रिया निकाय को लिख देगा।

[HttpPost] 
public async Task<Stream> Post([FromBody]SearchQuery searchQuery) 
{ 
    var response = await _searchClient.Search(searchQuery); 
    return await response.ReadAsStreamAsync(); 
} 
0

मेरे अनुभव से, डेविड के रूप में प्रतिक्रिया स्ट्रीम के माध्यम से गुजर सुझाव दिया काम करता है, लेकिन HTTP स्थिति कोड को बनाए रखने नहीं है। आप इस लाइन को जोड़ने के लिए होगा:

Response.StatusCode = (int)response.StatusCode; 

This answer एक पूरा HttpResponseMessage कॉपी करने का एक वैकल्पिक तरीका प्रदान करता है।