Friday, October 02, 2009 - 文章

CODE-ASPX接收jQuery.ajax傳送XML文件範例

今天應用到以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>
Build JScript.NET DLL

稍早發表利用JScript eval()函數提供高彈性的自訂條件運算式一文,隨即獲得網友ChrisTorng迴響,提出了關於eval運算式中可能被放入大量迴圈邏輯的問題以及Build JScript.NET DLL滅少CodeDom及Reflection使用的建議。(感謝!!)

關於第一點,的確,只要在執行階段允許外界輸入程式碼執行就要承擔風險!! 即便依照MSDN的說法,eval預設只能在被限制的環境中執行,被禁止接觸檔案、網路等本機資源,已大幅減少被誤用於入侵系統的可能性。但既然開放讓別人自由寫Code,就無法杜絕別人做傻事或做壞事的可能性,這是應用此一技術時必須要有的認知。

因此我補充一下自己的實務應用情境: 核心流桯引擎會讀入一份XML設定檔決定整個作業流程,而其中部分流動走向的條件則被寫成讓eval動態運算決定的Javascript運算式(當然,其中有些預先指定的特殊符號,可以代表當時系統中某些變數的值)。如此,我們只要修改XML就可以改變或產生各式流程,不需要為了流程中的判定邏輯修改.NET程式。而此分工下,撰寫運算式的人員就是有權寫Code的開發人員,原則上我們已信任他們的專業能力與善意心態,用eval()跑運算式而不是寫在.NET元件中,純粹只是為了修改快速,開發簡便,不致因使用eval()而衍生額外的風險。也因為此一前題,才敢大膽運用此技術。

至於第二點有點意思。從VS2008起,Visual Studio IDE已不再支援編輯維護JScript.NET專案,因此要用jsc命令列工具來編譯DLL。

啟動【程式集/Microsoft Visual Studio 2008/Visual Studio Tools/Visual Studio 2008 Command Prompt】,下指令jsc /target:library source.js就可以將JScript.NET原始碼編譯成DLL。

在專案中參考這個DLL,就可像一般元件一般呼叫它囉!

搜尋

Go

<October 2009>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
【工商服務】
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication