微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用ASP.NET通过POST接收(和发送)XML

我必须设置一个XML“Web服务”,它接收一个POST,其中’Content-type标头将指定“text / xml”.

将XML导入XDocument以便通过VB.NET的轴查询进行访问的最简单方法是什么?

我不相信Web服务可以保证遵循任何协议(例如SOAP等);只是针对各种请求的特定标签和子标签,它将使用基本身份验证,因此我将不得不处理标头.

(如果重要:
*实时版本将使用HTTPS,和
*响应也将是XML.)

解决方法

鉴于Steven的警告,答案可能是先用 Tom Holland’s test手动解析Request.InputStream,然后在Page_Load事件中解析XDocument.Load.

在我提出这个问题之前就已经开始了Google搜索,但只有在检查了this之后才进行了检查,这也表明我已经走上了正确的道路.

此外,我还要问一下我的观点暗示的问题,即响应必须是XML,关于什么是最好的方法,但我找到了答案here.

总之,最终的代码是:

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抛出HTTPException不是有害场景的有效最终解决方案.

原文地址:https://www.jb51.cc/aspnet/251778.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐