一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C#動(dòng)態(tài)調(diào)用Web服務(wù)的3種方法 - 51CTO.COM

 大卷風(fēng) 2010-10-04
    本文列出了如何在C#下動(dòng)態(tài)調(diào)用Web服務(wù)的3種方法,供大家參考。

    我們?cè)陂_(kāi)發(fā)C# WinForm時(shí),有時(shí)會(huì)調(diào)用Web服務(wù),服務(wù)是本地的當(dāng)前好辦,只要在Project中的Web References中引入就可以在代碼中直接創(chuàng)建一個(gè)Web服務(wù)對(duì)象來(lái)引用,其實(shí)其原理是C#幫你自動(dòng)創(chuàng)建客戶端代理類的方式調(diào)用WebService,但如果調(diào)用的服務(wù)是動(dòng)態(tài)的,比如說(shuō)在幾個(gè)IIS中都有相同的一個(gè)服務(wù),在運(yùn)行時(shí)輸入具體的IP才確定調(diào)用哪個(gè)服務(wù),那要怎么樣實(shí)現(xiàn)呢。

    C#動(dòng)態(tài)調(diào)用Web服務(wù)方法一: 手動(dòng)的添加一個(gè)Web引用,然后修改下本地的代理類。最后實(shí)現(xiàn)Web Service的URI部署到配置文件里。 具體做法如下:

    以下代碼是顯示如何配置動(dòng)態(tài)的Web Service,以服務(wù)單元C(類名為Web_SVSGC)為例:

    (1)首先在Web引用中的本地代理類中添加一個(gè)構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)是以Web Service的URL為參數(shù)的重載方法。

    復(fù)制  保存

            
    1. Namespace Web_SVSGC  
    2.     '< remarks/> 
    3.     < System.Diagnostics.DebuggerStepThroughAttribute(),  _     System.ComponentModel.DesignerCategoryAttribute("code"),  _     System.Web.Services.WebServiceBindingAttribute(Name:="SVSGCSoap", [Namespace]:="http:///QYJSERVICE/SVSGC"),  _     System.Xml.Serialization.XmlIncludeAttribute(GetType(Attribute))>  _  
    4.     Public Class SVSGC  
    5.         Inherits System.Web.Services.Protocols.SoapHttpClientProtocol  
    6.     '< remarks/> 
    7.         Public Sub New()  
    8.             MyBase.New  
    9.             Me.Url = "http://localhost/QYJSERVICE/WEBSERVICE/SERVICE/SVSGC.asmx" 
    10.         End Sub  
    11.  
    12.         '添加一個(gè)帶參數(shù)的構(gòu)造函數(shù)。  
    13.         Public Sub New(ByVal strUrl As String)   
    14.             MyBase.New()   
    15.             Me.Url = strUrl   
    16.         End Sub  
    17.  

    (2)將Web Service的url配置在調(diào)用Web Service的應(yīng)用程序的配置文件中。(其中的value可以隨時(shí)修改。)

    復(fù)制  保存

            
    1. < configuration> 
    2.     < appSettings> 
    3.               < add key="SVSGA_URL" value="http://192.168.108.188/ QDN/SERVICE/SVSGA.asmx" QDN/SERVICE/SVSGA.asmx" /> 
    4.     < /appSettings> 
    5. < /configuration>< configuration> 
    6.     < appSettings> 
    7.               < add key="SVSGA_URL" value="http://192.168.108.188/ QDN/SERVICE/SVSGA.asmx" QDN/SERVICE/SVSGA.asmx" /> 
    8.     < /appSettings> 
    9. < /configuration> 

    (3)調(diào)用時(shí),根據(jù)配置文件的Url動(dòng)態(tài)的生成Web Service。

    復(fù)制  保存       

            
    1. '要調(diào)用的Web Service的URL  
    2.         Dim strWebSvsUrl As String  
    3.         '聲明一個(gè)要調(diào)用的Web Service  
    4.         Dim objSVSGC As WebSvs_GC. SVSGC  
    5.         '調(diào)用Web Service的遠(yuǎn)程方法的返回值  
    6.         Dim strReturnValue As String  
    7.         Try  
    8.             '從配置文件中取得Web Service的URL  
    9.             strWebSvsUrl = _   
    10.             System.Configuration.ConfigurationSettings.AppSettings("SVSGC_URL")   
    11.             '生成一個(gè)Web Service實(shí)例  
    12.             objSVSGC = New WebSvs_GC.SVSGC (strWebSvsUrl)  
    13.             '調(diào)用這個(gè)Web Service里的遠(yuǎn)程方法  
    14.             strReturnValue = objSVSGC.HelloWorld()  
    15.         Catch ex As Exception  
    16.         End Try 

    C#動(dòng)態(tài)調(diào)用Web服務(wù)方法二:完全動(dòng)態(tài)處理,傳入服務(wù)服務(wù)網(wǎng)址,方法名和參數(shù)即可.

            
    1. using System;   
    2. using System.Net;   
    3. using System.IO;   
    4. using System.CodeDom;   
    5. using Microsoft.CSharp;   
    6. using System.CodeDom.Compiler;   
    7. using System.Web.Services.Description;   
    8. using System.Web.Services.Protocols;   
    9.  
    10. namespace HB.Common   
    11. {   
    12.     /* 調(diào)用方式   
    13.      *   string url = "http://www./globalweather.asmx" ;   
    14.      *   string[] args = new string[2] ;   
    15.      *   args[0] = "Hangzhou";   
    16.      *   args[1] = "China" ;   
    17.      *   object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;   
    18.      *   Response.Write(result.ToString());   
    19.      */   
    20.     public class WebServiceHelper   
    21.     {   
    22.         #region InvokeWebService   
    23.         /// < summary>   
    24.         /// 動(dòng)態(tài)調(diào)用web服務(wù)   
    25.         /// < /summary>   
    26.         /// < param name="url">WSDL服務(wù)地址< /param>   
    27.         /// < param name="methodname">方法名< /param>   
    28.         /// < param name="args">參數(shù)< /param>   
    29.         /// < returns>< /returns>   
    30.         public static object InvokeWebService(string url, string methodname, object[] args)   
    31.         {   
    32.             return WebServiceHelper.InvokeWebService(url, null, methodname, args);   
    33.         }   
    34.  
    35.         /// < summary>   
    36.         /// 動(dòng)態(tài)調(diào)用web服務(wù)   
    37.         /// < /summary>   
    38.         /// < param name="url">WSDL服務(wù)地址< /param>   
    39.         /// < param name="classname">類名< /param>   
    40.         /// < param name="methodname">方法名< /param>   
    41.         /// < param name="args">參數(shù)< /param>   
    42.         /// < returns>< /returns>   
    43.         public static object InvokeWebService(string url, string classname, string methodname, object[] args)   
    44.         {   
    45.             string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";   
    46.             if ((classname == null) || (classname == ""))   
    47.             {   
    48.                 classname = WebServiceHelper.GetWsClassName(url);   
    49.             }   
    50.  
    51.             try   
    52.             {   
    53.                 //獲取WSDL   
    54.                 WebClient wc = new WebClient();   
    55.                 Stream stream = wc.OpenRead(url + "?WSDL");   
    56.                 ServiceDescription sd = ServiceDescription.Read(stream);   
    57.                 ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();   
    58.                 sdi.AddServiceDescription(sd, """");   
    59.                 CodeNamespace cn = new CodeNamespace(@namespace);   
    60.  
    61.                 //生成客戶端代理類代碼   
    62.                 CodeCompileUnit ccu = new CodeCompileUnit();   
    63.                 ccu.Namespaces.Add(cn);   
    64.                 sdi.Import(cn, ccu);   
    65.                 CSharpCodeProvider icc = new CSharpCodeProvider();   
    66.  
    67.                 //設(shè)定編譯參數(shù)   
    68.                 CompilerParameters cplist = new CompilerParameters();   
    69.                 cplist.GenerateExecutable = false;   
    70.                 cplist.GenerateInMemory = true;   
    71.                 cplist.ReferencedAssemblies.Add("System.dll");   
    72.                 cplist.ReferencedAssemblies.Add("System.XML.dll");   
    73.                 cplist.ReferencedAssemblies.Add("System.Web.Services.dll");   
    74.                 cplist.ReferencedAssemblies.Add("System.Data.dll");   
    75.  
    76.                 //編譯代理類   
    77.                 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);   
    78.                 if (true == cr.Errors.HasErrors)   
    79.                 {   
    80.                     System.Text.StringBuilder sb = new System.Text.StringBuilder();   
    81.                     foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)   
    82.                     {   
    83.                         sb.Append(ce.ToString());   
    84.                         sb.Append(System.Environment.NewLine);   
    85.                     }   
    86.                     throw new Exception(sb.ToString());   
    87.                 }   
    88.  
    89.                 //生成代理實(shí)例,并調(diào)用方法   
    90.                 System.Reflection.Assembly assembly = cr.CompiledAssembly;   
    91.                 Type t = assembly.GetType(@namespace + "." + classname, truetrue);   
    92.                 object obj = Activator.CreateInstance(t);   
    93.                 System.Reflection.MethodInfo mi = t.GetMethod(methodname);   
    94.  
    95.                 return mi.Invoke(obj, args);   
    96.  
    97.                 /*   
    98.                 PropertyInfo propertyInfo = type.GetProperty(propertyname);   
    99.                 return propertyInfo.GetValue(obj, null);   
    100.                 */   
    101.             }   
    102.             catch (Exception ex)   
    103.             {   
    104.                 throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));   
    105.             }   
    106.         }   
    107.  
    108.         private static string GetWsClassName(string wsUrl)   
    109.         {   
    110.             string[] parts = wsUrl.Split('/');   
    111.             string[] pps = parts[parts.Length - 1].Split('.');   
    112.  
    113.             return pps[0];   
    114.         }   
    115.         #endregion   
    116.     }   

    返回時(shí)如果不是字符串,即強(qiáng)制轉(zhuǎn)換,如返回是DataSet,則

            
    1. string url = "http://www./globalweather.asmx" ;   
    2. string[] args = new string[2] ;   
    3. args[0] = "Hangzhou";   
    4. args[1] = "China" ;   
    5. object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args) ;   
    6. DataSet DSRe=(DataSet)result;  

    C#動(dòng)態(tài)調(diào)用Web服務(wù)方法三:URL Behavior 屬性

     

    如果知道服務(wù)的方法和參數(shù),只是調(diào)用的URL網(wǎng)址會(huì)隨時(shí)變化,那么可以手工創(chuàng)建一個(gè)服務(wù),添加上對(duì)應(yīng)的的方法和傳入?yún)?shù),然后引入到項(xiàng)目中,就可以直接開(kāi)發(fā),在創(chuàng)建服務(wù)的實(shí)例化時(shí),才修改對(duì)應(yīng)的URL即可.

    例如服務(wù)中有個(gè)方法叫GetTax,那么就可以這樣改:

            
    1. GetTax.GetTax GetTax1 = new GetTax.GetTax();   
    2. GetTax1.Url = "http://" + WebIp1 + "/pub_wa_gspsp1/gettax.asmx";        //動(dòng)態(tài)引入服務(wù)器   
    3.                    
    4. DataSet DS1 = GetTax1.GetTaxMx(Bm1, OldBz, Fpl, SLx, StaDa, EndDa);   //調(diào)用服務(wù)器返回開(kāi)票數(shù)據(jù) 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    91人妻人澡人人爽人人精品| 精品人妻av区波多野结依| 老熟女露脸一二三四区| 老富婆找帅哥按摩抠逼视频| 国产欧美一区二区久久| 伊人久久青草地婷婷综合| 久久三级国外久久久三级| 美女极度色诱视频在线观看| 午夜精品成年人免费视频| 好吊日在线观看免费视频| 国产a天堂一区二区专区| 欧美尤物在线视频91| 日韩欧美中文字幕av| 国产亚洲精品香蕉视频播放| 免费国产成人性生活生活片| 91日韩欧美中文字幕| 在线观看日韩欧美综合黄片| 久热在线视频这里只有精品| 国产一级一片内射视频在线| 亚洲天堂男人在线观看| 久久99精品国产麻豆婷婷洗澡| 国产精品欧美激情在线观看| 男女午夜福利院在线观看| 色鬼综合久久鬼色88| 中文字幕一区二区免费| 亚洲熟妇av一区二区三区色堂| 欧美人妻少妇精品久久性色| 国产在线不卡中文字幕| 91欧美视频在线观看免费 | 扒开腿狂躁女人爽出白浆av | 亚洲深夜精品福利一区| 精品国模一区二区三区欧美| 97人妻精品一区二区三区男同| 久久国产成人精品国产成人亚洲| 久久精品免费视看国产成人| 欧美性欧美一区二区三区| 国产精品美女午夜视频| 粉嫩国产美女国产av| 日本99精品在线观看| 日韩午夜福利高清在线观看| 欧美国产日本免费不卡|