С учетом предупреждения Стивена, ответ может состоять в том, чтобы вручную проанализировать Request.InputStream
, сначала тест Тома Холланда , а затем XDocument.Load
в событии Page_Load
.
Поиск в Google начался до того, как я задал вопрос, но проверил только после того, как нашел этот , что также указывает на то, что я на правильном пути.
Кроме того, я собирался задать вопрос, подразумеваемый моей точкой зрения, что ответом должен быть и XML, что является лучшим способом для этого, но я нашел ответ здесь .
В итоге, окончательный код:
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
и 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
не является окончательным решением для нежелательных сценариев.