1. 程式人生 > >c#中手動及半自動編譯wsdl並呼叫

c#中手動及半自動編譯wsdl並呼叫

首先,手動編譯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,否則執行時可能會實現不了功能。

//先驗證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;
            }
        }
//呼叫wsdl.exe編譯wsdl檔案
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來呼叫。