2014-06-20 7 views
6

वास्तव में कुछ के साथ संघर्ष कर रहा हूं, मुझे आशा है कि यहां लोग मदद कर सकते हैं। मैं वेब एपीआई 2 में एक रीस्टफुल एपीआई लिख रहा हूं। जब भी मैं इस सेवा के लिए अनुरोध भेजता हूं, प्रतिक्रिया के Content-Type के साथ लगातार भेजी जा रही है। जाहिर है यह कोई अच्छा नहीं है, मेरी प्रतिक्रिया Content-Typeapplication/json की आवश्यकता है। मैंने Google से कुछ सुझावों की कोशिश की है लेकिन मुझे नहीं लगता कि मैं पूरी तस्वीर को समझ रहा हूं।वेब एपीआई 2 लौटने वाले पाठ/सादे प्रतिक्रिया

क्या मेरी वेब सेवा application/json सामग्री के साथ प्रतिक्रिया देने के लिए मुझे कुछ खास करने की ज़रूरत है? ध्यान दें कि मैं इसे पूरे ऐप में वैश्विक स्तर पर काम करना चाहता हूं, इसलिए मैं किसी दिए गए प्रतिक्रिया को संशोधित करने और इसकी सामग्री प्रकार सेट करने के तरीके के बाद नहीं हूं - मैं चाहता हूं कि यह संपूर्ण वेब सेवा के लिए एक डिफ़ॉल्ट व्यवहार हो: यदि कोई अनुरोध शामिल है Acceptapplication/json के लिए हेडर मैं चाहता हूं कि मेरी वेब सेवा text/plain के बजाय Content-Type लौटा दे। स्पष्ट करने के लिए

संपादित करें:

मेरा जवाब एक वस्तु "responseData" कि JSON में श्रृंखलाबद्ध किया जाना चाहिए और शरीर में शामिल कहा जाता है। मैं वर्तमान में इस तरह मेरी प्रतिक्रिया एक साथ डाल रहा हूं:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseData); 
return response; 

responseData एक POCO है। यह JSON के रूप में सही ढंग से क्रमबद्ध किया गया है और प्रतिक्रिया में लौटाया गया है - केवल अनुपलब्ध भाग सामग्री-प्रकार है जो गलत रूप से "टेक्स्ट/सादा" पर सेट है। मैं इसे लिखने वाली प्रत्येक प्रतिक्रिया पर मैन्युअल रूप से इसे बदल सकता हूं, लेकिन मैं इसे वैश्विक स्तर पर कॉन्फ़िगर करना चाहता हूं।

+0

क्या प्रश्न में एपीआई जेएसओएन सामग्री के साथ एक 'स्ट्रिंग' वापस लौटाती है जिसे आपने स्वयं बनाया है? – Corey

+0

यह जांचें http://www.asp.net/web-api/overview/formats-and-model-binding/content-negotiation, http: //msdn.microsoft.com/en-us/magazine/dn574797.aspx , http: //blogs.msdn.com/b/henrikn/archive/2012/04/22/asp-net-web-api-content-negotiation-and-accept-charset.aspx, – malkam

+0

@ वर्तमान में प्रतिक्रिया वर्तमान में है इस फैशन में बनाया गया: 'HttpResponseMessage प्रतिक्रिया = Request.CreateResponse (HttpStatusCode.OK, प्रतिक्रिया डेटा); और फिर मैं अपनी कार्रवाई में' प्रतिक्रिया 'वापस कर देता हूं। प्रतिक्रिया डेटा की सामग्री को JSON में अच्छी तरह से क्रमबद्ध किया जा रहा है, लेकिन वास्तविक सामग्री-प्रकार शीर्षलेख अभी भी टेक्स्ट/सादा पर सेट है :( –

उत्तर

7

ठीक है, यह मानते हुए कि आपका responseData एक स्ट्रिंग है, Content-type हेडर text/plain होगा जब आप HttpResponseMessage बनाते हैं। कोई फर्क नहीं पड़ता कि स्ट्रिंग की सामग्री क्या है, क्योंकि इसे निर्धारित करने के लिए कोई प्रयास नहीं किया जाता है।

समाधान अपने संदेश के लिए उपयुक्त सामग्री वस्तु, आप वापस लौट रहे हैं मीडिया प्रकार के साथ प्रारंभ बनाने के लिए है:

HttpResponseMessage response = new HttpResponseMessage() 
    { 
     Content = new StringContent(
       responseData, 
       Encoding.UTF8, 
       "application/json" 
      ) 
    }; 

अन्य तरीकों कि राशि एक विशेष ऑब्जेक्ट प्रकार लौटने और एपीआई दे करने के लिए कर रहे हैं आवश्यकतानुसार पुस्तकालयों जेएसओएन या एक्सएमएल के लिए क्रमबद्ध है। मैं फ्रेमवर्क को मेरे लिए जहां भी संभव हो, काम करना पसंद करता हूं, लेकिन इस तरह आप इसे एक स्ट्रिंग के साथ प्राप्त कर सकते हैं जिसे आपने स्वयं बनाया है।


एक सख्त JSON-ही परिणाम के लिए, वेबएपीआई विन्यास से XML फ़ॉर्मेटर को हटा दें और अपने POCO लौट आते हैं।

App_Start\WebApiConfig.cs में, जोड़ने WebApiConfig.Register विधि के लिए निम्न:

config.Formatters.Remove(config.Formatters.XmlFormatter); 

और अपने एपीआई के लिए:

public class MyObject 
{ 
    public bool result; 
    public string reason; 
} 

public class TestController : ApiController 
{ 
    public MyObject GetData() 
    { 
     MyObject result = new MyObject { result = "true", reason = "Testing POCO return" }; 
     return result; 
    } 
} 

मैं इस ऊपर भाग गया और क्रोम से /api/Test का अनुरोध किया है, जो भी उल्लेख नहीं है Accept शीर्षलेख में।यहाँ प्रतिक्रिया अप हेडर जब तक यह Content-Type हिट:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 

और शरीर:

{"result":true,"reason":"Testing POCO return"} 

मैं विकलांग एक्सएमएल चूंकि यह JSON के लिए चूक।

+0

जैसा कि मेरे प्रश्न में बताया गया है, मैं एक वैश्विक तरीका खोजने की कोशिश कर रहा हूं मेरे द्वारा बनाई गई प्रत्येक प्रतिक्रिया के लिए सामग्री प्रकार को स्पष्ट रूप से परिभाषित करने के बजाय इसे सेट अप करें। मेरा शब्द शायद थोड़ा अस्पष्ट था - मैंने अपने ओपी को कुछ बिंदुओं को स्पष्ट रूप से स्पष्ट करने के लिए संपादित किया है। –

+0

क्या आपने ऑब्जेक्ट को केवल वापस करने का प्रयास किया है जब आप व्यक्तिगत रिटर्न पर अधिक नियंत्रण चाहते हैं, तो 'HttpResponseMessage' ठीक है, लेकिन आप एक पीओसीओ वापस कर सकते हैं और पुस्तकालयों को आपके लिए सीरियलाइजेशन का ख्याल रखना चाहिए - जेएसओएन या एक्सएमएल,' स्वीकार करें 'एच के आधार पर अनुरोध में eader। – Corey

+0

मुझे लगता है कि समस्या यह है कि अगर कुछ गलत हो जाता है तो मुझे अभी भी 404s या 500s वापस करने की आवश्यकता होगी - क्या यह अभी भी वर्णित दृष्टिकोण का उपयोग कर संभव है? –

0

Global.asax फ़ाइल में निम्न जोड़ें।

protected void Application_Start() 
{ 

JsonSerializerSettings serializerSettings = new JsonSerializerSettings(); 
serializerSettings.Converters.Add(new IsoDateTimeConverter()); 
var jsonFormatter = new JsonNetFormatter(serializerSettings); 
jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
GlobalConfiguration.Configuration.Formatters.Insert(0, jsonFormatter); 

} 
+0

यह माना जाता है कि किसी ने किसी प्रकार का जेसननेटफॉर्मेटर बनाया है, और उस समझ या अधिक विस्तार के बिना काम नहीं करता है। – Suamere

0

मुद्दा वर्णित का एक अन्य संभावित स्रोत एक प्राधिकरण हो सकता है खेल में पुनः प्रेषण हमारे लिए मामला था जब इंजीनियरों एक एपीआई के लिए उपयोगकर्ता प्रमाणन का पुनः उपयोग करने के लिए सोचा है।

इसका मतलब है कि आने वाले अनुरोधों को एक लॉगिन पृष्ठ पर रीडायरेक्ट किया जा रहा था जो text/html प्रतिक्रिया थी जिसे ReadAsync<> द्वारा पार्स नहीं किया जा सका। सुनिश्चित करने के लिए एक मूर्ख गलती है, लेकिन एक आसान जगह नहीं है।

उस मामले में समाधान उपयोगकर्ता प्रमाणीकरण को हटाने और एपीआई के लिए एचएमएसी आधारित प्रमाणीकरण को लागू करना था।

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