Laden...

MVC ResultFilter Buffer Problem auf IIS

Erstellt von Curse4Life vor 12 Jahren Letzter Beitrag vor 12 Jahren 527 Views
C
Curse4Life Themenstarter:in
452 Beiträge seit 2005
vor 12 Jahren
MVC ResultFilter Buffer Problem auf IIS

Oh man, ich habe mal wieder ein wahnwitziges Problem!

Ich habe eine Seite, die einen ResultFilter, den ich so auf den Response anwende:


internal class ResultFilters : IResultFilter
{
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {			
	var response = filterContext.HttpContext.Response;
			
	if (response.Filter != null)
	{
             response.Filter = new DynamicScriptStream(response.Filter);
        }
    }
}

und der Stream sieht so aus:


internal class DynamicScriptStream : Stream
	{
#region Abstract Stream methods
		
		private Stream _shrink;


		public DynamicScriptStream(Stream shrink)
		{
			_shrink = shrink;
		}


		public override bool CanRead { get { return true; } }
		public override bool CanSeek { get { return true; } }
		public override bool CanWrite { get { return true; } }
		public override void Flush() { _shrink.Flush(); }
		public override long Length { get { return 0; } }
		public override long Position { get; set; }


		public override int Read(byte[] buffer, int offset, int count)
		{
			return _shrink.Read(buffer, offset, count);
		}


		public override long Seek(long offset, SeekOrigin origin)
		{
			return _shrink.Seek(offset, origin);
		}


		public override void SetLength(long value)
		{
			_shrink.SetLength(value);
		}


		public override void Close()
		{
			_shrink.Close();
		}

#endregion
		

		public override void Write(byte[] buffer, int offset, int count)
		{
			// Load the HTML Code out of the response
			String html = System.Text.Encoding.UTF8.GetString(buffer, offset, count);			
			String scriptContent = String.Empty;

			
			var generatedCode = ger.GetGeneratedJavaScript();			
			if (!String.IsNullOrEmpty(generatedCode))
			{
				File.AppendAllText("testdebug.txt", buffer.Length + "|" + offset + "|" + count + "\n\n\n");				
				var lastBody = html.LastIndexOf("</body>");				


				scriptContent = "<script type=\"text/javascript\">\n";
				scriptContent += "$(document).ready(function () {\n";

				scriptContent += generatedCode;

				scriptContent += "});\n";
				scriptContent += "</script>\n";


				if (lastBody > -1)
				{					
					html = html.Insert(lastBody, "\n\n" + scriptContent);
				}
				else
				{					
					html += "\n\n" + scriptContent;
				}
			}


			// Send output  
			buffer = System.Text.Encoding.UTF8.GetBytes(html);
			_shrink.Write(buffer, 0, buffer.Length);			
		}		
	}

Funktioniert lokal (Mit VS Server) einwandfrei!
Dann habe ich das ganz auf unseren Server geschoben mit echtem IIS, laufen lassen und dann wurde die Seite nicht korrekt angezeigt.
Ich also debuggt und debuggt und nach langem hin und her habe ich es nun eingegrenzt.
Wie ihr oben seht, habe ich noch eine Debuggingzeile drin.
Und zwar lokal führt er diesen Filter einmal aus und die Bufferlänge beträgt 14476 und alles ist gut.
Auf dem Server führt er den Filter 2x aus, einmal mit einem Buffer von 13317 und einmal mit einem Buffer von 1257, WIESO?????????

Ich will den Filter natürlich nur einmal ausführen, wenn DER KOMPLETTE Response geladen ist. So gibts natürlich fehler, weil er einen unfertigen Response bearbeitet.

Irgendwelche Ideen?

Liebe Grüße

B
200 Beiträge seit 2006
vor 12 Jahren

Ich kenne das Problem.

Du musst im Write einfach bei jeden Aufruf den Buffer zwischenspeichern (Array) und erst beim Close den gesamten Buffer in den Stream (foreach durch das Array und _shrink.Write...) schreiben.

Lg