今天應用到以jQuery.ajax送出XML文件,以ASPX接收處理的寫法。在倉庫挖了好久,才找出不久前剛寫過的程式碼參考。為了避免中年記憶衰退成為我活到老,Coding到老路上的絆腳石,整理一下程式貼成KB,也順便與有此需求的鄉親們分享。

HttpRequest要傳遞整份XML文件時,並不是將XML字串放在參數中,而是把整個XML內容當成POST Request的主體,因此在jQuery端與ASPX端跟一般呼叫寫法有些不同。

傳送時,必須直接使用jQuery.ajax()以精確調控參數,沒法用$.post()偷懶。參數中conteType: "text/xml"用來向Web Server表明內容物為XML,processData: false則是要求jQuery將data內容原汁原味上傳,不要做任何解析或修改。

而在ASPX端,不是用Request[".."]接參數,而是要用Request.InputStream接入上傳內容。我在程式串同時列出2.0 XmlDocument及3.5 XDocument的做法比較,3.5明顯簡潔許多。

程式碼如下,有興趣的人就拿回去玩吧!

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.Linq" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    void Page_Load(object sender, EventArgs e)
    {
        if (Request["mode"] == "send")
        {
            try
            {
                //LINQ way
                XDocument xd =
                    XDocument.Load(new StreamReader(Request.InputStream));
                xd.Root.Add(new XElement("Mark", "Inserted by ASP.NET 3.5"));
                Response.Write(xd.ToString());
 
                /* Traditional Way
                XmlDocument xd2 = new XmlDocument();
                xd2.Load(Request.InputStream);
                XmlElement xe = xd2.CreateElement("Mark");
                xe.InnerText = "Inserted by ASP.NET 2.0";
                xd2.DocumentElement.AppendChild(xe);
                Response.Write(xd2.OuterXml);
                */
                Response.ContentType = "text/xml";
            }
            catch (Exception ex)
            {
                //return text, raise $.ajax error event
                Response.ContentType = "text/plain";
                Response.Write(ex.Message);
            }
            Response.End();
        }
    }
</script>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>jQuery Post XML Sample</title>
    <script src="js/jquery-1.3.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        function postXml(url, xmlSrc, callback) {
            var xmlString = 
                jQuery.isXMLDoc(xmlSrc) ?
                xmlSrc.xml || (new XMLSerializer()).serializeToString(xmlSrc) :
                xmlSrc;
            $.ajax({
                url: url,
                contentType: "text/xml",
                data: xmlString,
                dataType: "xml",
                success: function(x) { callback(x); },
                error: function(xhr, textStatus, thrownError) { 
                        alert("Error:" + xhr.responseText);  },
                processData: false,
                type: "POST"
            });
        }
        $(function() {
            $("#btnSend").click(function() {
                postXml("AjaxPostXmlSample.aspx?mode=send",
                $("#taXml").val(), function(xd) {
                    alert(xd.xml || 
                    (new XMLSerializer()).serializeToString(xd));
                });
            });
        });
    </script>
</head>
<body>
<textarea id="taXml" cols="40" rows="5">&lt;Books&gt;
   &lt;Book Title="The Art of Trouble-Shooting" Author="Darkthread" /&gt;
&lt;/Books&gt;</textarea>
<input type="button" id="btnSend" value="Send" />
</body>
</html>

Comments

# by 91

一邊拜 一邊收下了 :)

# by chicken

提供兩個不相甘的 tips .. :P 1. 如果只是單純的接到 request, 要傳 xml 回去... 我都慣用 .ashx, 不用 .aspx ... 因為 System.Web.Page 比 IHttpHandler 多包了一堆東西,效能有差... 2. XmlDocument 抓出 XML 再 write, XML 檔太大或結構複雜時也會有效能問題... 我會反過來,把 XML 的內容儲存到 Response 裡... Response.Write(xd2.OuterXml); 這行改成: xd2.Save(Response.Output);

# by Jeffrey

to chicken, 您的Tips我收下了,感恩~~~

# by Ark

獻醜 程式的文章貼fb還真難看 http://www.facebook.com/profile.php?id=100000042888921&ref=profile#/note.php?note_id=109712408787 內容是MVC架構下的 jquery+ajax+json 用Controller來吞吐server & client的互動~連aspx,ashx都不必 agreements型別class也可以自定 還有StreamReader 有Dispose() 的棉角 一般~習慣~會記得用 using(){}包起來再玩弄他

# by Jeffrey

to Ark, using關鍵字強制Dispose的做法主要用來解決unmanaged resource資源釋放的問題,當牽涉資源為.NET記憶體物件時的風險不高(如果我的理解沒有錯的話)。不過一律加using是有病治病,沒病強身的良好習慣,謝謝提醒。

Post a comment