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을 플러시 할 때 발생하기 때문에 지금 NULL 인 객체가 응답이어야합니다 .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;
    }
}

무효가 아닌 유일한 객체는 다른 방법 (스택 추적에 표시되는)입니다. _buffers입니다. 해당 클래스에서 NULL로 설정된 유일한 장소는 클라이언트가 연결을 끊을 때 더 깊이 파고 들면 RecycleBufferElements ()에 있습니다.

다른 팁

플러시로의 호출은 메모리에 캐시 된 모든 것이 스트림에 기록되고 궁극적으로 클라이언트에 기록되므로 문제가 될 수 있습니다.

요청은 실행하는 데 시간이 오래 걸릴 것으로 예상되므로 ASP.NET 또는 IIS가 너무 일찍 시간을내어 타이핑을 할 수 있습니다. 나는 그것을 보는 것이 좋습니다 executiontimeout 속성 web.config 그리고 비슷한 설정.

아니요, Flush를 호출 할 때 발생하면 유일한 시간보다 늦었습니다. Context.Response.OutputStream 실제로 참조됩니다. 값은 전화로 가져옵니다 XmlTextWriter 생성자, 그리고 다시 보지 않았습니다.

스택 추적에서 더 많은 정보가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top