轉載:動態呼叫WebService(C#)
阿新 • • 發佈:2018-12-11
#region
InvokeWebService
//
動態呼叫web服務
public
static
object
InvokeWebService(
string
url,
string
methodname,
object
[] args) {
return
WebServiceHelper.InvokeWebService(url ,
null
,methodname ,args) ; }
public
static
object
InvokeWebService(
string
url,
string
classname,
string
methodname,
object
[] args) {
string
@namespace
=
"
EnterpriseServerBase.WebService.DynamicWebCalling
"
;
if
((classname
==
null
)
||
(classname
==
""
)) { classname
=
WebServiceHelper.GetWsClassName(url) ; }
try
{
//
獲取WSDL
WebClient wc
=
new
WebClient(); Stream stream
=
wc.OpenRead(url
+
"
?WSDL
"
); ServiceDescription sd
=
ServiceDescription.Read(stream); 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();
//
設定編譯引數
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()); }
//
生成代理例項,並呼叫方法
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
(Exception ex) {
throw
new
Exception(ex.InnerException.Message,
new
Exception(ex.InnerException.StackTrace)); } }
private
static
string
GetWsClassName(
string
wsUrl) {
string
[] parts
=
wsUrl.Split(
'
/
'
) ;
string
[] pps
=
parts[parts.Length
-
1
].Split(
'
.
'
) ;
return
pps[
0
] ; }
#endregion