رمز الخطأ أو الاستثناء - ما هي أفضل ممارسة لخدمة ويب ASP.Net؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لقد قرأت هذا خيط لـ WCF يحتوي على رموز وأشياء مخصصة للخطأ.

ولكن ما هي أفضل الممارسات ل أسب.نت خدمات الويب؟هل أقوم بطرح استثناءات وأسمح للعميل بمعالجة الاستثناء أو إرسال رمز خطأ (نجاح أو فشل وما إلى ذلك) الذي سيعتمد عليه العميل للقيام بمعالجته.

تحديث:فقط لمزيد من المناقشة في حالة صابون, لنفترض أن العميل يقوم بإجراء SVC على شبكة الإنترنت call التي من المفترض أن تكون رسالة إعلام (لا توجد قيمة مرتجعة متوقعة)، لذلك يسير كل شيء بسلاسة ولا يتم طرح أي استثناءات بواسطة svc.

الآن كيف سيعرف العميل ما إذا كانت مكالمة الإشعار قد فقدت بسبب مشكلة في الاتصال/الشبكة أو شيء ما بين الخادم والعميل؟قارن هذا بعدم وجود أي استثناء.قد يفترض العميل أنه نجاح.لكنها ليست كذلك.فقدت المكالمة في مكان ما.

هل يضمن إرسال رمز خطأ "نجاح" للعميل أن المكالمة تمت بسلاسة؟هل هناك أي طريقة أخرى لتحقيق ذلك أم أن السيناريو أعلاه ممكن؟

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

المحلول

نشر جيف أتوود مقالة مثيرة للاهتمام حول هذا الموضوع منذ فترة.وعلى الرغم من تحويل استثناء ‎.NET إلى SoapFault، وهو متوافق مع معظم مجموعات الأدوات الأخرى، إلا أن المعلومات الموجودة في الأخطاء ليست جيدة جدًا.لذلك، فإن خلاصة المقالة هي أن خدمات الويب .NET لا تطرح رسائل استثناء جيدة جدًا ويجب عليك إضافة معلومات إضافية:

Private Sub WebServiceExceptionHandler(ByVal ex As Exception)
    Dim ueh As New AspUnhandledExceptionHandler
    ueh.HandleException(ex)

    '-- Build the detail element of the SOAP fault.
    Dim doc As New System.Xml.XmlDocument
    Dim node As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
        SoapException.DetailElementName.Name, _
        SoapException.DetailElementName.Namespace)

    '-- append our error detail string to the SOAP detail element
    Dim details As System.Xml.XmlNode = doc.CreateNode(XmlNodeType.Element, _
        "ExceptionInfo", _
        SoapException.DetailElementName.Namespace)
    details.InnerText = ueh.ExceptionToString(ex)
    node.AppendChild(details)

    '-- re-throw the exception so we can package additional info
    Throw New SoapException("Unhandled Exception: " & ex.Message, _
        SoapException.ClientFaultCode, _
        Context.Request.Url.ToString, node)
End Sub

مزيد من المعلومات لماذا تعتبر عيوب الصابون أفضل في هذا السؤال.

نصائح أخرى

يعتمد على الطريقة التي ستستهلك بها خدمة الويب - على سبيل المثال.ما هو البروتوكول الذي ستستخدمه؟

إذا كان GET أو POST، فمن الأفضل إرجاع رمز الخطأ، حيث أن استدعاء HttpWebRequest (.Net) أو أي رمز آخر سيتلقى خطأ في الخادم، وسيتعين عليك التعامل معه لاستخراج رمز الاستثناء.

إذا كان SOAP - فمن المقبول تمامًا طرح استثناءات مخصصة (لا ترغب في إرجاع استثناءات إطار العمل الداخلي، لأنها قد تكشف عن بعض تتبع المكدس، وما إلى ذلك).لأطراف خارجية).

نظرًا لأن خدمات الويب الخاصة بـ SOAP تهدف تمامًا إلى النظر إلى رمز الاتصال باعتباره استدعاء أسلوب عادي، فيجب أن يكون إطار الاتصال المقابل قادرًا على التعامل مع الاستثناء ونشره بشكل جيد، مما يجعل رمز الاتصال يبدو ويتصرف أثناء تعامله مع المكالمات الداخلية .

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