NullReferenceException عند إرسال الانتاج XMLWrite إلى httpContext.Response.OutputStream

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

سؤال

ولدي التطبيق حيث بين الحين والآخر انني اتلقى خطأ غريب. هذا هو قطعة من التعليمات البرمجية:

Dim XMLWriter As New System.Xml.XmlTextWriter(Me.Context.Response.OutputStream, Encoding.UTF8)
XMLWriter.WriteStartDocument()
XMLWriter.WriteStartElement("Status")

Message.SerializeToXML(XMLWriter)

XMLWriter.WriteEndElement()
XMLWriter.WriteEndDocument()
XMLWriter.Flush()
XMLWriter.Close()

والخطأ أنني أتلقى هو: الرسالة: مرجع كائن لم يتم تعيين إلى مثيل كائن

وعلى XMLWriter.Flush خط ()؛

لجعل الامور أكثر متعة، وهذا هو تماما غير قابلة للتكرار. انها مجرد يحدث بين الحين والآخر ....

ومنذ ذلك يحدث عندما بيغ XML انا التخمين الكائن الذي هو الآن باطل يجب أن يكون Response.OutputStream.

وهذا هو الجزء ذي الصلة من تتبع المكدس:

Description:
An unhandled exception occurred and the process was terminated.

Exception: System.NullReferenceException

Message: Object reference not set to an instance of an object.

StackTrace:    at System.Web.HttpWriter.BufferData(Byte[] data, Int32 offset, Int32 size, Boolean needToCopyData)
   at System.Web.HttpWriter.WriteFromStream(Byte[] data, Int32 offset, Int32 size)
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.Xml.XmlTextWriter.Flush()
   at RequestData.CompleteRequest(MessageBase Message) in RequestData.vb:line 142

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

وأي أفكار أخرى؟ (أي مؤشرات تقدير)

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

المحلول

والعاكس يعطي هذا:

private void BufferData(byte[] data, int offset, int size, bool needToCopyData)
{
    int num;
    if (this._lastBuffer != null)
    {
        num = this._lastBuffer.Append(data, offset, size);
        size -= num;
        offset += num;
    }
    else if ((!needToCopyData && (offset == 0)) && !this._responseBufferingOn)
    {
        this._buffers.Add(new HttpResponseBufferElement(data, size));
        return;
    }
    while (size > 0)
    {
        this._lastBuffer = this.CreateNewMemoryBufferElement();
        this._buffers.Add(this._lastBuffer);
        num = this._lastBuffer.Append(data, offset, size);
        offset += num;
        size -= num;
    }
}

والكائن الوحيد الذي لم يتم تحديد لاغية، تهيئة أو الرجوع إليها من خلال طريقة أخرى (والتي من شأنها أن تظهر في تتبع المكدس) هو this._buffers. المكان الوحيد الذي تم تعيينه لاغيا في تلك الفئة في RecycleBufferElements () التي إذا كنت حفر أعمق يمكن أن تحدث عند قطع اتصال العميل.

نصائح أخرى

والدعوة إلى الاحمرار هو ما سوف يسبب أي شيء مؤقتا في الذاكرة لتكون مكتوبة إلى تيار وفي نهاية المطاف العميل لذلك نعم، قد تكون المشكلة.

ولقد ذكرت أنه من المتوقع أن يستغرق وقتا طويلا لتنفيذ ذلك قد يكون من الممكن أن ASP.Net أو IIS وتوقيت خروجك من السابق لأوانه الطلب. أود أن أقترح وجود نظرة على executionTimeout العقارات في الملف web.config وإعدادات مماثلة.

لا، إذا كان يحدث عند استدعاء فلوش، وهذا الطريق في وقت لاحق من تتم الإشارة الوقت Context.Response.OutputStream فقط في الواقع. وجلب القيمة في الدعوة إلى منشئ XmlTextWriter، ومن ثم لم ينظر في مرة أخرى.

هل لديك أي مزيد من المعلومات من تتبع المكدس؟

scroll top