ما هي أفضل طريقة لإرجاع الأخطاء من خدمة WCF بطريقة RESTful؟

StackOverflow https://stackoverflow.com/questions/417632

سؤال

يبدو استخدام WCF بطريقة RESTful أمرًا رائعًا.أنا من أشد المعجبين بالأشياء الكبيرة مثل البساطة والمرونة، ولكني أيضًا أحب الطريقة التي تظهر بها عناوين URL في نهاية المطاف.ماذا يمكنني أن أقول، أنا مبرمج.

تتم مطابقة واجهة برمجة التطبيقات البسيطة لاسترداد الموارد وتحريرها بمجموعة بسيطة تقريبًا من استجابات الأخطاء المحتملة، ولا يسعني إلا أن أشعر أنه من أجل الالتزام بنهج RESTful "الخالص"، قد أقطع أنفي نكاية بالوجه، أو بشكل أكثر تحديدًا، أنف مستهلكي خدمة الويب الخاصة بي.قد أكون مخطئًا، ولكن لا يبدو أن هناك الكثير من رموز خطأ Http التي يمكنني استخدامها، ولا توجد طرق لتمرير رسالة خطأ مخصصة.

للتوضيح، أنا أتحدث عن أخطاء استثنائية صحيحة وليست أخطاء متوقعة.أريد بالفعل توصيل مشكلة إلى المستخدم لمساعدته في تحديد ما يتعين عليه فعله لتصحيحها.

الخيارات الممكنة التي أفكر فيها...

  1. فقط استخدم رموز خطأ Http – يبدو أن هذا سيكون مقيدًا للغاية فيما أستطيع التعبير عنه، ولن يسمح لي بتقديم رسالة مخصصة.يرجى تصحيح لي إذا كنت مخطئا.

  2. قم دائمًا بإرجاع نجاح Http ولكن قم بإرجاع كائنات الخطأ المخصصة – من الواضح أنها الأكثر مرونة ولكنها بالتأكيد ليست الأكثر راحة.

سأكون ممتنًا حقًا لو تمكن أي شخص من مشاركة بعض تجارب العالم الحقيقي حول هذه المشكلة بالذات.


تحديث

شكرا لاقتراح استخدام StatusDescription ملكية OutgoingWebResponseContext هدف.بدا في البداية أنه شيء يمكنني استخدامه.

لقد توصلت إلى استنتاج مفاده أن خياري الثاني أعلاه ليس مناسبًا لي.أريد التمسك بما يمكن أن يقدمه لي Http.

ومع ذلك، أواجه مشاكل في تشغيله.بغض النظر عن القيمة التي أقدمها لهذه الخاصية، فلن يتم إرجاعها في الرد.

تبدو طريقة الخدمة الخاصة بي هكذا

public MyType GetMyTypes(string criteria)
{
    try
    {
        return GetMyTypes();
    }
    catch (Exception ex)
    {
        OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
        response.StatusCode = HttpStatusCode.Forbidden;
        response.StatusDescription = "A Big fat error occurred";
        return null;
    }
}

وهنا رسالة الرد الأولية.لا يوجد ذكر للرسالة المخصصة ...

HTTP/1.1 403 محظور
الخادم:خادم تطوير ASP.NET/9.0.0.0
تاريخ:الأربعاء 07 يناير 2009 الساعة 14:01:20 بتوقيت جرينتش
إصدار X-AspNet:2.0.50727
التحكم في ذاكرة التخزين المؤقت:خاص
طول المحتوى:0
اتصال:يغلق

ليس الأمر كما لو أنني بحاجة فقط للوصول إلى الخاصية الصحيحة لدى العميل.المعلومات ببساطة لا يتم إرسالها عبر الرابط.

ماذا يفعل هذا StatusDescription الملكية تفعل فعلا؟


تحديث

لم أعرف أبدًا كيفية تعيين خاصية StatusDescription.وانتهى بي الأمر بعدم تضمين أي رسالة خطأ على الإطلاق، والانتقال فقط إلى رموز حالة Http.لقد اخترت الكشف عن نقطتي نهاية Soap وRestful لخدماتي، وبالتالي يمكن للعملاء اختيار ما يفضلون استخدامه - رسائل Restful البسيطة أو رسائل Soap الأكثر ثراءً نسبيًا.

هل كانت مفيدة؟

المحلول

أرسل رمز الاستجابة المناسب ويمكنك تقديم رسالة الخطأ المخصصة في نص الاستجابة.

نصائح أخرى

مع .net 4، ارمي أ WebFaultException<T>(T errorDetail, HttpResponseCodecode)

هنا تقوم بتعيين نوع الاستجابة الخاص بك على نوع كائن آخر، وهو أمر منطقي، كما تقوم أيضًا بتعيين ResponseCode هذا ما تريده.

ال errorDetail يجب أن تكون قابلة للتسلسل

http://blogs.msdn.com/b/endpoint/archive/2010/01/21/error-handling-in-wcf-webhttp-services-with-webfaultexception.aspx

أقوم بإضافة رمز الخطأ على النحو الوارد أعلاه (في وصف الحالة) وفي نص الصفحة التي تم إرجاعها في خدمات REST الخاصة بي على النحو التالي:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.Unauthorized;
response.StatusDescription = "You are not authorized.";
HttpContext.Current.Response.Write("You are not authorized.");
return null;

يرى هذا الموضوع لسؤال مماثل.

باختصار، أعتقد أنه يمكنك تعيين رمز حالة HTTP (إلى أحد رموز الخطأ)، وتقديم رسالتك المخصصة في وصف الحالة ملكية:

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = System.Net.HttpStatusCode.Forbidden;
response.StatusDescription = "Custom";

لا أعرف الكثير عن مدى انتشار هذه التقنية في العالم الحقيقي للأسف.

قد يكون هذا عيبا.اعتبارًا من 22/09/2011، كانت المشكلة قيد المراجعة بواسطة فريق المنتج:

http://connect.microsoft.com/VisualStudio/feedback/details/690162/wcf-rest-custom-outgoingwebresponsecontext-statusdescription-not-returned-in-response

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top