c#中手動及半自動編譯wsdl並呼叫
阿新 • • 發佈:2019-02-01
首先,手動編譯wsdl並呼叫:
1)使用瀏覽器開啟webService頁面。如:http://192.168.1.5:8080/Service.axms?wsdl
2)使用頁面另存功能,將當前頁面儲存為Service.wsdl檔案。
3)使用管理員許可權開啟 VS開發人員命令提示,
輸入命令 wsdl Service.wsdl檔案全路徑 /out: 將要生成的cs檔案的全路徑
如:wsdl c:\\...\\Service.wsdl /out: c:\\...\\Service.cs
注意:這裡的命令中如果路徑內容裡存在空格,請使用英文雙引號將路徑包括起來,如:"c:\\xxxx\\Service.wsdl"
該命令將在out所指定的路徑下生成.cs檔案,.cs檔案中的內容就為webService頁面原始檔的代理類。
4)在c#專案中--新增現有項--該.cs檔案--引入System.Web.Serivce,使用該.cs檔案中的方法,即可呼叫webService頁面中同名介面,並向WebService傳遞資料。
優點:編譯時不需要設定細節引數,省心啊
缺點:有環境要求
上述步驟3中,如果沒有安裝VS,可以使用 Microsoft SDKs 下的wsdl.exe工具。Microsoft SDKs 需要安裝。
其次,半自動方法編譯wsdl並呼叫:
上程式碼吧,主要是使用了c#的類呼叫應用程式wsdl.exe完成。
這種方式下,請使用管理員許可權開啟VS,否則執行時可能會實現不了功能。
//呼叫wsdl.exe編譯wsdl檔案//先驗證url private void CheckUrl(String sUrl) { if (sUrl.Equals("")) { MessageBox.Show("請輸入url!"); return; } if (!sUrl.Contains("http://")) { MessageBox.Show("請輸入正確的url!"); return; } if (sUrl.Contains("localhost")) { MessageBox.Show("請用明確的IP地址替換localhost。"); return; } sUrl = sUrl.Trim(); if (!sUrl.EndsWith("?wsdl") && !sUrl.EndsWith("?WSDL")) { sUrl += "?wsdl"; } UrlText.Text = sUrl; //UrlText.Refresh(); //MessageBox.Show(sUrl); try { HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(sUrl); HttpWebResponse response = (HttpWebResponse)myReq.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { //成功 //sOutputInfo = "Url連線成功!\r\n"; OutputText.Text += "Url連線成功!\r\n"; } else { //失敗 //sOutputInfo = "Url連線成功!\r\n"; OutputText.Text += "Url連線失敗!\r\n"; } } catch (Exception ex) { MessageBox.Show(ex.Message); OutputText.Text += "發生了異常!程式執行失敗!\r\n"; return; } }
String sFileName = sUrl.Substring(sUrl.LastIndexOf("/")+1, sUrl.LastIndexOf(".") - sUrl.LastIndexOf("/")-1) ;
try
{
// 1. 使用 WebClient 下載 WSDL 資訊。
WebClient web = new WebClient();
Stream stream = web.OpenRead(sUrl);
// 2. 建立和格式化 WSDL 文件。
ServiceDescription description = ServiceDescription.Read(stream);
description.Write(sWorkPath + "\\" + sFileName + ".wsdl");
//sOutputInfo = "wsdl檔案寫入成功!\r\n";
OutputText.Text += sFileName + ".wsdl" + "檔案正在寫入...\r\n";
//確定.wsdl檔案的存在
if (File.Exists(sWorkPath + "\\" + sFileName + ".wsdl"))
{
OutputText.Text += sFileName + ".wsdl" + "檔案寫入成功!\r\n";
}
else
{
OutputText.Text += sFileName + ".wsdl" + "檔案寫入失敗!\r\n";
}
//開始編譯cs檔案
OutputText.Text += "開始編譯.cs檔案...\r\n";
Process proc = new Process();
proc.StartInfo.FileName = sWorkPath + "\\wsdl.exe"; //"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\bin\\NETFX 4.5.1 Tools\\wsdl.exe";//
proc.StartInfo.Arguments = sWorkPath + "\\" + sFileName + ".wsdl" + " /out:" + sWorkPath + "\\" + sFileName + ".cs";
proc.StartInfo.UseShellExecute = false;
if (proc.Start())
{
//OutputText.Text += proc.ToString() + "\r\n";
OutputText.Text += "wsdl.exe命令呼叫成功!\r\n";
}
else
{
OutputText.Text += "wsdl.exe命令呼叫失敗!\r\n";
}
//等待命令執行完成
proc.WaitForExit();
//確定.cs檔案的存在
if (File.Exists(sWorkPath + "\\" + sFileName + ".cs"))
{
OutputText.Text += sFileName + ".cs" + "檔案寫入成功!\r\n";
}
else
{
OutputText.Text += sFileName + ".cs" + "檔案寫入失敗!\r\n";
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
OutputText.Text += "發生了異常!程式執行失敗!\r\n";
return;
}
}
呼叫csc.exe將.cs檔案編譯成.dll,這裡使用了與上述同樣的方法。
String sFileName = sUrl.Substring(sUrl.LastIndexOf("/") + 1, sUrl.LastIndexOf(".") - sUrl.LastIndexOf("/") - 1);
try
{
//開始編譯dll檔案
OutputText.Text += "開始編譯.dll檔案...\r\n";
Process proc = new Process();
proc.StartInfo.FileName = sWorkPath + "\\csc.exe"; //"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\bin\\NETFX 4.5.1 Tools\\wsdl.exe";//cmd.exe //
//proc.StartInfo.Arguments = sWorkPath + "\\" + "*.cs" + " /out:" + sWorkPath + "\\" + sFileName + ".dll";
proc.StartInfo.Arguments = " /t:library /out:\"" + sWorkPath + "\\" + sFileName + ".dll\" \"" + sWorkPath + "\\*.cs\"";
// /t:library
proc.StartInfo.UseShellExecute = false;
//proc.Start();
//proc.WaitForInputIdle();
if (proc.Start())
{
//OutputText.Text += proc.ToString() + "\r\n";
OutputText.Text += "csc.exe命令呼叫成功!\r\n";
}
else
{
OutputText.Text += "csc.exe命令呼叫失敗!\r\n";
}
//等待命令執行完成
proc.WaitForExit();
//確定.dll檔案的存在
if (File.Exists(sWorkPath + "\\" + sFileName + ".dll"))
{
OutputText.Text += sFileName + ".dll" + "檔案寫入成功!\r\n";
}
else
{
OutputText.Text += sFileName + ".dll" + "檔案寫入失敗!\r\n";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
OutputText.Text += "發生了異常!程式執行失敗!\r\n";
return;
}
}
驗證時,可將使用手動方法的第4個步驟,或者載入.dll來呼叫。