BUG: POST Navigate Call Fails If the WebBrowser Control Displays an XML Document (322122)



The information in this article applies to:

  • Microsoft Internet Explorer (Programming) 5.5 SP2
  • Microsoft Internet Explorer (Programming) 6.0

This article was previously published under Q322122

SYMPTOMS

If you host the WebBrowser control and display an XML document, any calls to the Navigate method or the Navigate2 method with a POST request fail.

CAUSE

Internet Explorer is not successful when it tries to convert the Uniform Resource Locator (URL) to a multi-byte string. Therefore, Internet Explorer cannot recognize the protocol and the address.

RESOLUTION

You can work around this problem if you move to about:blank, wait for the DocumentComplete event, and then perform the POST request for the Navigate method from there. You must set a flag so that the Navigate call is not performed on every DocumentComplete event that is fired. The "More Information" section of this article contains example code for this workaround.

STATUS

Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.

MORE INFORMATION

Steps to Reproduce the Behavior

  1. Create a Test.xml file, a Test.xsl file (which will be used with the Test.xml file), a Test.htm file, and a Test.asp file. Examples of all of the files follow: Test.xml
    <?xml version="1.0"?> 
    <?xml-stylesheet type="text/xsl" href="test.xsl" ?> 
    <Null>
    </Null>
    					
    Test.xsl
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
    <html>
    <body>
    <form action="http://myserver/mydirectory/test.asp" method="post">
    <input type="submit"/>
    </form>
    </body>
    </html>
    </xsl:template>
    </xsl:stylesheet>
    					
    Test.htm
    <html>
    <body>
    <form action="http://myserver/mydirectory/test.asp" method="post">
    <input type="submit"/>
    </form>
    </body>
    </html>
    					
    Test.asp
    <%@ LANGUAGE="VBSCRIPT" %>
    <HTML>
    <BODY>
    <%=now%>
    </BODY>
    </HTML>
    					
  2. Place these four files on your Web server (Myserver) in a directory that is named Mydirectory.
  3. Create a new Microsoft Visual Basic .exe project and host the WebBrowser control.
  4. Add the Form_Load load handler function with code that moves to the .xml page. A global baseURL variable is also used to make testing with a different base URL easier.
    Dim baseURL As String
    Private Sub Form_Load()
        baseURL = "http://myserver/mydirectory/"
        'WebBrowser1.Navigate baseURL + "test.htm"
        WebBrowser1.Navigate baseURL + "test.xml"
    End Sub
    					
  5. Add a button with a click handler to move to the .asp page with a POST request.
    Private Sub Command1_Click()
        Dim PostData() As Byte
        
        PostData = "Information sent to host"
        PostData = StrConv(PostData, vbFromUnicode)
        
        Dim url2 As Variant
        url2 = baseURL + "test.asp"
        WebBrowser1.Navigate url2, Null, Null, PostData, Null
    End Sub
    					
  6. Build the project and then click the Visual Basic Form button, not the button on the HTML page.

    The resulting problem is that navigation does not occur. If you change the Form_Load function to initially move to an .htm page, and then click the Form button, you see the POST navigation succeed. You also see that if you click the HTML Form button you succeed in the navigation.
  7. To apply the workaround, add a global flag to know when to run the workaround and a DocumentComplete handler to perform the actual POST navigation.
  8. Move the code in the click handler to the DocumentComplete function. And, in the click handler, move to about:blank. The code example with the workaround follows:
    Dim bFlag As Boolean
    Dim baseURL As String
    Private Sub Command1_Click()
        bFlag = True
        WebBrowser1.Navigate "about:blank"
    End Sub
    
    Private Sub Form_Load()
        baseURL = "http://myserver/mydirectory/"
        'WebBrowser1.Navigate baseURL + "test.htm"
        WebBrowser1.Navigate baseURL + "test.xml"
        bFlag = False
    End Sub
    
    Private Sub WebBrowser1_DownloadComplete()
        If bFlag Then
            bFlag = False
            Dim PostData() As Byte
            
            PostData = "Information sent to host"
            PostData = StrConv(PostData, vbFromUnicode)
            
            Dim url2 As Variant
            url2 = baseURL + "test.asp"
            WebBrowser1.Navigate url2, Null, Null, PostData, Null
        End If
    End Sub
    					

Modification Type:MajorLast Reviewed:5/12/2003
Keywords:kbAutomation kbbug kbpending kbWebBrowser KB322122