日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

通过反射动态调用webservices

發(fā)布時(shí)間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过反射动态调用webservices 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

該方法可以使程序不通過(guò)web引用的方式去調(diào)用webservices方法,直接在代碼里調(diào)用該方法就能達(dá)到動(dòng)態(tài)調(diào)用webservices的目的。使用前先引用System.Web.Services動(dòng)態(tài)鏈接庫(kù),是.net自帶的dll。

方法如下:

using?System;
using?System.Collections.Generic;
using?System.Text;
using?System.Net;
using?System.IO;
using?System.Web.Services.Description;
using?System.CodeDom;
using?Microsoft.CSharp;
using?System.CodeDom.Compiler;

namespace?TestSkin
{
????
class?Webservices
????{
????????
///?<summary>
????????
///?實(shí)例化WebServices
????????
///?</summary>
????????
///?<param?name="url">WebServices地址</param>
????????
///?<param?name="methodname">調(diào)用的方法</param>
????????
///?<param?name="args">把webservices里需要的參數(shù)按順序放到這個(gè)object[]里</param>
????????public?static?object?InvokeWebService(string?url,?string?methodname,?object[]?args)
????????{

????????????
//這里的namespace是需引用的webservices的命名空間,在這里是寫死的,大家可以加一個(gè)參數(shù)從外面?zhèn)鬟M(jìn)來(lái)。
????????????string?@namespace?=?"client";
????????????
try
????????????{
????????????????
//獲取WSDL
????????????????WebClient?wc?=?new?WebClient();
????????????????Stream?stream?
=?wc.OpenRead(url?+?"?WSDL");
????????????????ServiceDescription?sd?
=?ServiceDescription.Read(stream);
????????????????
string?classname?=?sd.Services[0].Name;
????????????????ServiceDescriptionImporter?sdi?
=?new?ServiceDescriptionImporter();
????????????????sdi.AddServiceDescription(sd,?
"",?"");
????????????????CodeNamespace?cn?
=?new?CodeNamespace(@namespace);

????????????????
//生成客戶端代理類代碼
????????????????CodeCompileUnit?ccu?=?new?CodeCompileUnit();
????????????????ccu.Namespaces.Add(cn);
????????????????sdi.Import(cn,?ccu);
????????????????CSharpCodeProvider?csc?
=?new?CSharpCodeProvider();
????????????????ICodeCompiler?icc?
=?csc.CreateCompiler();

????????????????
//設(shè)定編譯參數(shù)
????????????????CompilerParameters?cplist?=?new?CompilerParameters();
????????????????cplist.GenerateExecutable?
=?false;
????????????????cplist.GenerateInMemory?
=?true;
????????????????cplist.ReferencedAssemblies.Add(
"System.dll");
????????????????cplist.ReferencedAssemblies.Add(
"System.XML.dll");
????????????????cplist.ReferencedAssemblies.Add(
"System.Web.Services.dll");
????????????????cplist.ReferencedAssemblies.Add(
"System.Data.dll");

????????????????
//編譯代理類
????????????????CompilerResults?cr?=?icc.CompileAssemblyFromDom(cplist,?ccu);
????????????????
if?(true?==?cr.Errors.HasErrors)
????????????????{
????????????????????System.Text.StringBuilder?sb?
=?new?System.Text.StringBuilder();
????????????????????
foreach?(System.CodeDom.Compiler.CompilerError?ce?in?cr.Errors)
????????????????????{
????????????????????????sb.Append(ce.ToString());
????????????????????????sb.Append(System.Environment.NewLine);
????????????????????}
????????????????????
throw?new?Exception(sb.ToString());
????????????????}

????????????????
//生成代理實(shí)例,并調(diào)用方法
????????????????System.Reflection.Assembly?assembly?=?cr.CompiledAssembly;
????????????????Type?t?
=?assembly.GetType(@namespace?+?"."?+?classname,?true,?true);
????????????????
object?obj?=?Activator.CreateInstance(t);
????????????????System.Reflection.MethodInfo?mi?
=?t.GetMethod(methodname);

????????????????
return?mi.Invoke(obj,?args);
????????????}
????????????
catch
????????????{
????????????????
return?null;
????????????}
????????}
????}
}

轉(zhuǎn)載于:https://www.cnblogs.com/ruochen/archive/2007/12/11/990427.html

總結(jié)

以上是生活随笔為你收集整理的通过反射动态调用webservices的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。