मैं WCF REST विधि से एक कस्टम HTTP स्थिति कोड कैसे वापस कर सकता हूं?


88

यदि WCF REST कॉल में कुछ गलत हो जाता है, जैसे कि अनुरोधित संसाधन नहीं मिला है, तो मैं अपने ऑपरेशनकॉन्ट्रैक्ट पद्धति में HTTP प्रतिक्रिया कोड (इसे HTTP 404 जैसी किसी चीज़ के लिए सेट करना) के साथ कैसे खेल सकता हूं?


ठीक है कि इस मान नियंत्रण के सभी जवाबों ने इसे आपकी सेवा कार्यान्वयन में बदल दिया। क्या होगा अगर वे कुछ पूरी तरह से अवैध यूरी पास करते हैं? आप अपनी सेवा के सभी अप्रत्याशित हिट के लिए 404 कैसे प्रदान करते हैं?
नाथन ट्रेगिलस

जवाबों:


111

एक WebOperationContextऐसा तरीका है जिसे आप एक्सेस कर सकते हैं और इसमें एक OutgoingResponseप्रकार की संपत्ति होती है OutgoingWebResponseContextजिसमें एक StatusCodeसंपत्ति होती है जिसे सेट किया जा सकता है।

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;

5
क्या यह WCF डेटा सेवाओं - सेवा संचालन के अंदर काम करता है? मेरे पास भाग्य नहीं है, लगता है कि स्टेटसकोड मैं सेट करता हूं कि वह किसी और चीज से ट्रम्प हो जाता है। इसलिए सभी HTTP POST अनुरोधों पर, मुझे इस बात की परवाह किए बिना कि मैं इसे २०१ST में सेट करता हूं, मुझे २०४ वापस मिल जाएंगे।
RyBolt

1
मेरे मामले में काम नहीं करता है, स्थिति अधिलेखित हो जाती है। WebFaultExceptionहालाँकि, फेंकना काम करने लगता है।
जोश एम।

73

यदि आपको एक कारण निकाय वापस करने की आवश्यकता है, तो WebFaultException पर एक नज़र डालें

उदाहरण के लिए

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );

4
मुझे यह स्वीकार किए जाने वाले से बेहतर लगता है क्योंकि हम स्थैतिक WebOperationContext.Current का उपयोग नहीं कर रहे हैं
नोएल अब्राहम

ध्यान रखें कि यह केवल अकाल 4 के बाद से मान्य है। msdn.microsoft.com/en-us/library/dd989924.aspx
sebagomez

हम्म, .NET 4.5.1 में यह मेरे लिए स्टेटस कोड सेट नहीं कर रहा है, मुझे अभी भी 200 मिल रहा है। मैं jsonp का उपयोग कर रहा हूं, यह मेरे कॉलबैक (जावास्क्रिप्ट में) कॉल कर रहा है और मेरा संदेश और मेरा स्टेटस कोड एक के रूप में पास कर रहा है पूर्णांक।
शाविस

4
यह 2XX कोड के बाहर किसी भी चीज के लिए बहुत अच्छा लगता है, लेकिन क्या आप WebFaultExceptionइसे वापस करने के लिए फेंक देंगे HttpStatusCode.Created?
क्रश

23

404 के लिए WebOperationContext.Current.OutgoingResponse पर SetStatusAsNotFound (स्ट्रिंग संदेश) नामक एक अंतर्निहित विधि है जो स्टेटस कोड को 404 पर सेट करेगा और एक कॉल के लिए एक स्टेटस विवरण।

ध्यान दें, वहाँ भी है, SetStatusAsCreated (उड़ी स्थान) जो 201 कोड की स्थिति और एक हेडर के साथ स्थान हेडर सेट करेगा।


क्या यह स्वीकृत उत्तर में प्रदर्शित विधि से अधिक पसंद किया जाता है?
क्रश

2

यदि आप शीर्ष लेख में स्थिति का विवरण देखना चाहते हैं, तो REST पद्धति को नीचे दिए गए तरीके से पकड़ने () खंड से अशक्त वापसी सुनिश्चित करनी चाहिए:

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
यह मेरे लिए भी काम नहीं करता था, मुझे अभी भी एक 200 मिलता है। मैं WebHttpBinding को crossDomainScriptAccessEnabled = "true" के साथ उपयोग कर रहा हूं और वेबहेटप का एक एंड पॉइंट बिहेवियर लिपटे हुए की डिफ़ॉल्ट बॉडी स्टाइल और json के एक डिफॉल्ट जाइंग रिस्पॉन्स फॉर्मेट के साथ उपयोग कर रहा हूं। लेकिन यह बात नहीं होनी चाहिए, यह चाहिए?
शाविस

2

आप WebOperationContext के StatusCode और StatusDescription के साथ एक स्थिति और कारण निकाय भी लौटा सकते हैं :

WebOperationContext context = WebOperationContext.Current;
context.OutgoingResponse.StatusCode = HttpStatusCode.OK;
context.OutgoingResponse.StatusDescription = "Your Message";


0

यह मेरे लिए WCF डेटा सेवाओं के लिए काम नहीं किया। इसके बजाय, आप डेटा सेवा के मामले में डेटा सेवा का उपयोग कर सकते हैं। निम्न पोस्ट उपयोगी पाया। http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/f0cbab98-fcd7-4248-af81-5f74b019d8de


यह मेरे लिए भी काम नहीं करता है, मुझे सिर्फ 400 बैड रिक्वेस्ट मिलती हैं, जिसमें कोई अन्य उपयोगी जानकारी नहीं है, और कोई प्रतिक्रिया नहीं है।
शाविस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.