2008-11-12 5 views
1

나는 지금 어딘가에 이상한 오류가 발생하는 응용 프로그램이 있습니다. 이 코드의 조각 :XMLWrite 출력을 httpContext.Response.OutputStream에 보낼 때 NullReferenceException이 발생했습니다.

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 인 Object를 추측하고 있기 때문에 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 초 동안 응답하지 않을 수 있습니다 ... 클라이언트가 연결을 끊으면 (즉, 브라우저 창을 닫으면)이 스트림이 Null이 될 수 있습니까? ?

다른 아이디어? (모든 포인터가 높이 평가 됨)

답변

1

반사판이 제공 :

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이다. 이 클래스에서 null로 설정된 유일한 곳은 클라이언트가 연결을 끊을 때 더 깊게 파고들 수있는 RecycleBufferElements()입니다.

0

아니요, 플러시를 호출 할 때 발생하면 No이 실제로 참조 된 시간보다 늦습니다. 값이 XmlTextWriter 생성자에 대한 호출에서 반입되고 다시 보지 않습니다.

스택 추적에서 더 이상의 정보가 있습니까?

+0

나는 그것을 이해하지만, OutputStream 내에서 문제가되는 부분은 null이라는 사실을 알고 있습니까? –

0

플러시를 호출하면 메모리에 캐시 된 모든 항목이 스트림에 쓰여지고 궁극적으로 클라이언트가 그렇듯이 문제가 될 수 있습니다.

요청이 실행되는 데 시간이 많이 소요될 것으로 예상되므로 ASP.Net 또는 IIS가 너무 일찍 시간을 초과 할 가능성이 있습니다. executionTimeout property in the web.config 및 이와 유사한 설정을 살펴 보는 것이 좋습니다.