سؤال

أنا أقوم ببناء خدمة ويب WCF التي ترجع كائنا مركبا يشبه ما يلي:

    [DataContract]
    public class WebServiceReturn
    {
        ...

        [DataMember]
        public XmlElement Results { get; set; }

        ...
    }

عندما أرجع كائن WebServicereturn مع التعليمات البرمجية التالية، كل شيء على ما يرام:

    XElement cities = new XElement("Cities",
                          from r in results
                          select new XElement("City", r));            

    using (XmlReader xmlReader = cities.CreateReader())
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlReader);
        WebServiceReturn response = new WebServiceReturn();
        response.Results = xmlDoc.DocumentElement;
    }

ومع ذلك، عندما أستخدم الرمز أدناه، والذي يأخذ XMLEMELEMENT من نتائج مكالمة إجراء مخزنة ترجع XMLDATAdoCument، يتم إلقاء التواصل (لا يوجد لديه استثناءات داخلية).

XmlDataDocument xdd = DataAccess.ExecuteXML("MyStoredProc", parameter);
response.Results = xdd.DocumentElement;

الجزء المربك هو إذا قمت بتحويل XmldatAdoCument.Documentelement (وهو XMLEMENT) في Xelement ثم العودة إلى XMLELEMENT، فلا توجد مشاكل (نجاح باهر كان الفم) - لذلك إرجاع التعليمات البرمجية التالية دون أي مشكلة.

        XmlElement xe = DataAccess.ExecuteXML("MyStoredProc", parameter).DocumentElement;
        XDocument xDoc = new XDocument();
        using (XmlWriter xmlWriter = xDoc.CreateWriter()){
            xe.WriteTo(xmlWriter);
        }

        using (XmlReader xmlReader = xDoc.Root.CreateReader())
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlReader);
            response.Results = xmlDoc.DocumentElement;
        }   

تفاصيل الاتصالات هي:

الاتصالات: لم يقدم الخادم ردا ذا معنى؛ قد يكون سبب هذا عدم تطابق العقد، وإغلاق الجلسة المبكرة أو خطأ خادم داخلي.

لقد قمت أيضا بتحديث مرجع الخدمة في تطبيق الاختبار الخاص بي عدة مرات التي لم يكن لها أي تأثير.

هل المشكلة مع رمز الاختبار الخاص بي الذي يدعو خدمة الويب؟ لماذا سيجلب تحويل XMLELELEMENT إلى Xelement ثم العودة إلى إصلاح المشكلة؟ أي معلومات على الإطلاق سيكون موضع تقدير كبير! :)

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

المحلول

أنا لا أعرف أي شيء غريب عنه XmlDataDocument, ، لكنك لا تحتاج بالضرورة XDocument - محاولة:

XmlDocument newDoc = new XmlDocument();
newDoc.Load(new XmlNodeReader(doc.DocumentElement));
return newDoc.DocumentElement;

لا يزال غير مثالي، ولكن يبدو أنظف لي ...

نصائح أخرى

حسنا، من أجل الحصول على مزيد من معلومات الخطأ، ستحتاج إلى تمكين تفاصيل التصحيح في خطأ الخادم الخاص بك - الرسالة التي تحصل عليها الآن هي رسالة خطأ WCF Generic، والكشف عن المهاجمين، في الأساس قائلا: حدث خطأ ما.

من أجل القيام بذلك، تحتاج إلى تعديل تكوين الخدمة الخاصة بك - إضافة هذا القسم (إذا لم يكن لديك بالفعل واحدة):

<behaviors>
  <serviceBehaviors>
    <behavior name="MEXandDebug">
      <serviceMetadata />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

ثم الرجوع إلى هذا القسم من تعريف الخدمة الخاص بك:

<services>
  <service behaviorConfiguration="MEXandDebug" name="WCFService.MyWCFService">

يجب أن يمنحك خطأ أكثر أهمية، نأمل أن يمنحك فكرة عما يحدث خطأ.

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

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