Firefox Multiple Write Problem using custom Response Filter - Invalid Viewstate

Posted on 2008-10-03
Last Modified: 2013-11-07
I implemented a whitespace filter based on the following article: I've discovered a problem with Firefox when the response size requires multiple calls to the Filter's Write method. On the rendered page, Firefox inserts a non-standard character between the two Write() outputs. In particular, this often happens in the middle of the Viewstate variable which causes the dreaded System.Web.HttpException: Invalid_Viewstate error. Here's an excerpt from such a problem viewstate:


except that the "_" between the C and Z is a single character. If I paste it in here directly, it renders as the following: &#0 or what may be an ascii null. In firefox, it appears as the diamond question mark to indicate a bad charset character.

This only happens in Firefox. Can someone explain to me why the null character is being inserted and how to correct for this problem?

Thanks in advance.

From WhitespaceFilter Class:

   Public Overrides Sub Write( _

         ByVal MyBuffer() As Byte, _

         ByVal offset As Integer, _

         ByVal count As Integer)

      Static bFirstPass As Boolean = True

      Static bHTML As Boolean = True

      ' See if Filter is Enabled

      Dim sFilter As Object = HttpRuntime.Cache("AppFilterWhiteSpace")

      If sFilter Is Nothing Then

         Dim sSQL As String = _

               "SELECT GR0_Value FROM GenericRef WHERE GR0_Type = 'System' AND GR0_Key = 'FilterWhiteSpace'"

         sFilter = CNull(DBInfo.ExecuteScalar(sSQL), "False")

         HttpRuntime.Cache.Insert("AppFilterWhiteSpace", sFilter, Nothing, _

               DateTime.Now.AddMinutes(15), TimeSpan.Zero)

      End If

      Dim data(count) As Byte

      Buffer.BlockCopy(MyBuffer, offset, data, 0, count)

      ' Process Filter 

      If sFilter <> "True" Then

         ' Use Output As Is 

         _sink.Write(data, 0, data.GetLength(0))


         ' Filter Leading Whitespace

         ' Don't use ASCII encoding here.  The .NET IDE replaces

         ' some characters, such as ®

         ' with a UTF-8 entity.  If you use ASCII encoding,

         ' you'll get B. instead of the registered

         ' trademark symbol.

         Dim s As String = System.Text.Encoding.UTF8.GetString(data)

         If bFirstPass Then

            bFirstPass = False

            bHTML = s.ToUpper.IndexOf("<HTML>") > -1

         End If

         If Not bHTML Then

            ' Use Output As Is 

            _sink.Write(data, 0, data.GetLength(0))


            ' Remove Whitespace

            ' Break string into separate lines

            ' - each line will end with prior line's carriage return

            ' - each line will begin with leading whitespace that we want to remove

            Dim aLine() As String = s.Split(vbLf)

            For iLine As Integer = 0 To aLine.GetUpperBound(0)

               aLine(iLine) = aLine(iLine).TrimStart()


            ' Rejoin the lines

            s = String.Join(vbLf, aLine)

            ' Finally, we spit out what we have done.

            Dim outdata() As Byte = System.Text.Encoding.UTF8.GetBytes(s)

            _sink.Write(outdata, 0, outdata.GetLength(0))

        End If

      End If

   End Sub

From Global.asax.vb

    Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)

      Response.Filter = New WhitespaceFilter(Response.Filter)

    End Sub

Open in new window

Question by:ZekeLA
  • 2

Accepted Solution

alexpercsi earned 250 total points
ID: 22669213
Just a stab in the dark:

When calling _sink.Write(outdata, 0, outdata.GetLength(0)), you might actually be getting the length wtih one unit too big, causing an ASCII null to be inserted.


_sink.Write(outdata, 0, outdata.GetLength(0)-1) and see if you are missing any characters or if it solves your problem.

Best Regards,
Alex Percsi.

Author Comment

ID: 22674109
Thank you Alex. For a stab in the dark, it seems to be the correct solution. I still need to do more testing and won't get to do that for a few days but it certainly looks like you solved my problem. I'll update this thread once I complete the additional testing.

Author Closing Comment

ID: 31502929
I've tested the solution and plan to move it into Production. Apparently, GetBytes includes a final null character [bytes(nLastChar) is nothing] which is not part of the original string. IE ignores the null but Firefox doesn't. Thanks again.

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Just a quick little trick I learned recently.  Now that I'm using jQuery with abandon in my applications, I have grown tired of the following syntax:      (CODE) I suppose it just offends my sense of decency to put inline VBScript on a…
IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
This is used to tweak the memory usage for your computer, it is used for servers more so than workstations but just be careful editing registry settings as it may cause irreversible results. I hold no responsibility for anything you do to the regist…
Internet Business Fax to Email Made Easy - With eFax Corporate (, you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now