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.
↑ Back to the top
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.
↑ Back to the top
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.
↑ Back to the top
Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.
↑ Back to the top
Steps to Reproduce the Behavior
- 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>
- Place these four files on your Web server (Myserver) in a directory that is named Mydirectory.
- Create a new Microsoft Visual Basic .exe project and host the WebBrowser control.
- 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
- 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
- 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. - 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.
- 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
↑ Back to the top