سؤال

إنه الوضع الغريب مرة أخرى :)

لقد عملت على التحقق من XML مع XSD ويلقي استثناء عند فشل التحقق من الصحة. (تسمى الوظيفة من صفحة الويب التي تتلقى مكالمات XML)

كلا المكالمة

if (!xmlvld.ValidXmlDoc(X, "", "https://somepathtofile.xsd")) 
    throw new Exception(xmlvld.ValidationError + "1");

ووظيفة التحقق بسيطة جدا

   /// <summary>
    /// This method validates an xml string against an xml schema.
    /// </summary>
    /// <param name="xml">StringReader containing xml</param>
    /// <param name="schemaNamespace">XML Schema Namespace</param>
    /// <param name="schemaUri">XML Schema Uri</param>
    /// <returns>bool</returns>
    public bool ValidXmlDoc(StringReader xml, string schemaNamespace, string schemaUri)
    {
        // Continue?
        if (xml == null || schemaNamespace == null || schemaUri == null)
        {
            return false;
        }

        isValidXml = true;
        XmlValidatingReader vr;
        XmlTextReader tr;
        XmlSchemaCollection schemaCol = new XmlSchemaCollection();
        schemaCol.Add(schemaNamespace, schemaUri);

        try
        {
            // Read the xml.
            tr = new XmlTextReader(xml);
            // Create the validator.
            vr = new XmlValidatingReader(tr);
            // Set the validation tyep.
            vr.ValidationType = ValidationType.Auto;
            // Add the schema.
            if (schemaCol != null)
            {
                vr.Schemas.Add(schemaCol);
            }
            // Set the validation event handler.
            vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            // Read the xml schema.
            while (vr.Read())
            {
            }

            vr.Close();

            return isValidXml;
        }
        catch (Exception ex)
        {
            this.ValidationError = ex.Message;
            return false;
        }
        finally
        {
            // Clean up...
            vr = null;
            tr = null;
        }
    }

وقد نجح هذا بشكل جيد للغاية على مدار العامين الماضيين ، ولكن في الآونة الأخيرة بدأت وظيفة التحقق من الصحة في إعادة رسالة Follwing:

[ValidationError]Circular attribute group reference.[/ValidationError]

وهي رسالة خاطئة - لم يتغير XSD أو XML المرسلة ، علاوة على ذلك ، إذا قمت بإعادة تدوير تجمع التطبيقات ، وأرسلت نفس برنامج XML مرة أخرى (أنا "Ping" يرسل نفس XML كل بضع ثوانٍ وأفحص النتيجة) يمر التحقق من الصحة ... لفترة من الوقت (بعضها بين بضع دقائق وبضع ساعات).

يجلس XSD في نفس الدليل مثل صفحة الاتصال وفي سجل الخادم ، أرى الطلب إلى XSD مع استجابة HTTP/200 ، حتى أنني حاولت تغيير HTTPs إلى المسار المحلي لكن الخطأ ظل كما هو (يشير إلى عنوان غير صالح يعطي HTTP/404 أو استثناءات مسار غير صالحة حتى تحاول قراءة ملف XSD)

مرة أخرى - إعادة تدوير AppPool يحلها على الفور ولكن لا يمكنني إعادة التدوير كل 5 دقائق.

شكرا لك مقدما! سيمون

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

المحلول

لن تحب هذه الإجابة ، ولكن يبدو أن XmlValidatingReader تم أن أوفق في .NET 2.0 ... ربما بسبب قضايا مثل هذه؟

الاقتراح هو التحقق من صحة باستخدام XmlReader. هذا الرابط مخصص للإصدار 2.0 من ملفات المساعدة ، والذي يتضمن بعض التفاصيل الخاصة بالتحويل من XmlValidatingReader; ؛ تتوفر الإصدارات الأكثر حداثة من المساعدة من المنسدلة في الأعلى.

هذا الرابط يعطي تفاصيل حول XmlValidatingReader كونها عفا عليها الزمن.

مثال على استخدام XmlReader هو هنا.

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