Given Stevenโs warning, the answer might be to parse Request.InputStream first with the Tom Holland test and then XDocument.Load in Page_Load .
A Google search that started before I asked a question, but only checked it, found this one , also suggesting that I be on the right track.
In addition, I was about to ask the question, implied by my point of view, that the answer should have been XML too, regarding what is best for this, but I found the answer.
So the final code is:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Request.ContentType <> "text/xml" Then _ Throw New HttpException(500, "Unexpected Content-Type") Dim id = CheckBasicAuthentication Dim textReader = New IO.StreamReader(Request.InputStream) CheckXmlValidity(textReader) ' Reset the stream & reader Request.InputStream.Seek(0, IO.SeekOrigin.Begin) textReader.DiscardBufferedData() Dim xmlIn = XDocument.Load(textReader) ' process XML in xmlIn Dim xmlOut = <?xml version="1.0" encoding="UTF-8" ?> <someresult> <header> <id><%= id.ToString() %></id> <datestamp>To be inserted</datestamp> </header> <result/> </someresult> ' Further generation of XML for output xmlOut.<someresult>.<header>.<datestamp>.Value = Date.UtcNow.ToString(xmlDateFormat) xmlText.Text = xmlOut.ToString End Sub Private Function CheckBasicAuthentication() As Integer Dim httpAuthorisation = Request.Headers("Authorization") If Left(httpAuthorisation, 6).ToUpperInvariant <> "BASIC " Then _ Throw New HttpException(401, "Basic Authentication Required") Dim authorization = Convert.FromBase64String(Mid(httpAuthorisation, 7)) Dim credentials = Text.Encoding.UTF8.GetString(authorization).Split(":"c) Dim username = credentials(0) Dim password = credentials(1) Return ConfirmValidUser(username, password) End Function Private Shared Sub CheckXmlValidity(ByVal textReader As System.IO.StreamReader) Try ' Check for "interesting" xml documents. Dim settings = New System.Xml.XmlReaderSettings() settings.XmlResolver = Nothing settings.MaxCharactersInDocument = 655360 ' Successfully parse the file, otherwise an XmlException is to be thrown. ' Dim reader = System.Xml.XmlReader.Create(textReader, settings) Try While reader.Read() 'Just checking. End While Finally reader.Close() End Try Catch ex As Exception Throw New HttpException(500, "Invalid Xml data", ex) End Try End Sub
and ASP.NET webpage.aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="webpage.aspx.vb" Inherits="WebPage" ContentType="text/xml" %> <asp:Literal ID="xmlText" runat="server" Mode="PassThrough"></asp:Literal>
NB Throwing HTTPException not a valid definitive solution for unwanted scenarios.
source share