更新时间:2022-06-03 22:30:51
由于史蒂芬的警告,答案可能是解析 Request.InputStream
手动汤姆·霍兰德的测试第一,其次是 XDocument.Load
在的Page_Load
事件
Given Steven's warning, the answer may be to parse Request.InputStream
manually with Tom Holland's test first, followed by XDocument.Load
in the Page_Load
event.
有一个谷歌搜索发起之前,我问的问题,但毕竟只是检查,发现这个,还建议我在正确的轨道上。
A Google search initiated before I asked the question, but only checked after, found this, also suggesting I'm on the right track.
此外,我要问的反应必须是XML过,至于究竟是什么,***的方式通过我的观点所隐含的问题,但我已经找到答案的这里。
Also I was going to ask the question implied by my point that the response had to be XML too, as to what is the best way for that, but I've found an answer here.
总之,最后的code是:
In summary, 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
和ASP.NET webpage.aspx是:
and the ASP.NET webpage.aspx is:
<%@ 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投掷 HTTPException
是不是不需要的情况下有效的最终解决方案。
NB Throwing HTTPException
is not a valid final solution for unwanted scenarios.