Web Service可以回傳的型態多樣,最近工作上遇到了要求須使用物件進行回傳,在Class產出及Class細部設定部分用了很久,因此有了以下筆記。
【開發環境】
開發工具:Visual Studio Professional 2015
.Net Framework:4.6.1
本次主要是遇到必須與對方進行XML電文交換,下方是範例電文,原本以為就回傳XmlDocument就好了,但這一切都是我的天真,對方期望的是回傳物件....
<?xml version="1.0" encoding="UTF-8"?>
<myprefix1:Parent xmlns:myprefix1="http://myurl.com.tw/">
<myprefix1:Header>
<myprefix1:From>FromAddress</myprefix1:From>
<myprefix1:To>ToAddress</myprefix1:To>
</myprefix1:Header>
<myprefix1:Body>
<myprefix1:Status>Success</myprefix1:Status>
</myprefix1:Body>
</myprefix1:Parent>
上面其實可以看到這個電文有Namespace也有Prefix,然後我們要用物件接收對方傳進來的這麼xml,也必須用物件傳回去。
【問題一】要如何從Xml檔產生.cs檔呢?
這時候可以使用xsd.exe,他的位置會在以下路徑底下。
C:\Program Files (x86)\Microsoft SDKs\Windows\
詳細路徑可能會依照每個人電腦安裝的Framework版本不同而不一樣,像是我電腦xsd.exe的位置在....
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
首先,在上方位置列的地方輸入cmd並按下Enter。
這樣就會開啟命令提示字元(cmd.exe),而且也幫你切換到這個目錄下了,非常的方便呢!
接下來輸入『xsd 你要轉的檔案 /outputdir:你想放的位置』,像是下方的範例。
xsd D:\TEST\SampleXml.xml /outputdir:D:\TEST
按下Enter後會產生.xsd檔。
再來輸入『xsd 你要轉的xsd檔案 /classes /outputdir:你想放的位置』把xsd轉成.cs檔,如下。
xsd D:\TEST\SampleXml.xsd /classes /outputdir:D:\TEST
這樣就大功告成可以產生.cs檔了。
【問題二】物件回傳Namespace Prefix不見了!?
這是後要對產出來的物件進行處理,打開產出的.cs檔在最外層標籤的class內加上以下代碼。
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces xmlns
{
get
{
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xsn.Add("myprefix1", "http://myurl.com.tw/");
return xsn;
}
set { /* needed for xml serialization */ }
}
結果會如下圖所示。
這樣return物件的時候就也會有Namespace Prefix了!
參考資料:
XML Schema Definition Tool (Xsd.exe)
Web 服務描述語言工具 (Wsdl.exe)
Remove namespace from ASP.NET web service, or add namespace prefix?