/// <summary>web
/// WebServiceDemo 的摘要說明數組
/// </summary>異步
[WebService(Namespace = "http://tempuri.org/")]ide
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]ui
[System.ComponentModel.ToolboxItem(false)]url
// 若要容許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消註釋如下行。spa
// [System.Web.Script.Services.ScriptService]代理
public class WebServiceDemo : System.Web.Services.WebServiceorm
{ip
[WebMethod]
public string HelloWorld(string name)
{
return "Hello World,"+name;
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
namespace Tools
{
public delegate object InvokeWebServiceHandler(string serviceUrl, string classname, string methodname, object[] objects);
public class WebServiceHelper
{
/// <summary>
/// 動態調用WebService
/// </summary>
/// <param name="url">WebService地址</param>
/// <param name="classname">WebService類名</param>
/// <param name="methodname">調用的類名</param>
/// <param name="args">參數數組</param>
public object InvokeWebService(string url, string classname, string methodname, object[] args)
{
try
{
string @namespace = "fangqm.Netbank.WebService.webservice";
if (classname == null || classname == "")
{
classname = GetClassName(url);
}
SetCertificatePolicy();
//獲取服務描述語言(WSDL)
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");//【1】
ServiceDescription sd = ServiceDescription.Read(stream);//【2】
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//【3】
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace);//【4】
//生成客戶端代理類代碼
CodeCompileUnit ccu = new CodeCompileUnit();//【5】
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();//【6】
ICodeCompiler icc = csc.CreateCompiler();//【7】
//設定編譯器的參數
CompilerParameters cplist = new CompilerParameters();//【8】
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);//【9】
if (true == cr.Errors.HasErrors)
{
System.Text.StringBuilder sb = new StringBuilder();
foreach (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 bj = Activator.CreateInstance(t);//【10】
System.Reflection.MethodInfo mi = t.GetMethod(methodname);//【11】
return mi.Invoke(bj, args);
}
catch (Exception ex)
{
return null;
}
}
private string GetClassName(string url)
{
//假如URL爲"http://localhost:51837/Service1.asmx"
//最終的返回值爲 Service1
string[] parts = url.Split('/');
string[] pps = parts[parts.Length - 1].Split('.');
return pps[0];
}
/// <summary>
/// Sets the cert policy.
/// </summary>
public static void SetCertificatePolicy()
{
ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
}
/// <summary>
/// Remotes the certificate validate.
/// </summary>
private static bool RemoteCertificateValidate(
object sender, X509Certificate cert,
X509Chain chain, SslPolicyErrors error)
{
// trust any certificate!!!
System.Console.WriteLine("Warning, trust any certificate");
return true;
}
/// <summary>
///CallBack method of dynamic Invoke WebService
/// </summary>
/// <param name="ar">status of Async operate</param>
public void CallBackForWebservice(IAsyncResult iar)
{
InvokeWebServiceHandler dn = (InvokeWebServiceHandler)iar.AsyncState;
if (iar.IsCompleted == true)
{
try
{
dn.EndInvoke(iar);
}
catch (Exception e)
{
}
}
}
}
}
string strWebServiceUrl="http://localhost:10974/WebServiceDemo.asmx";
object[] objects = new object[] {「500」};
return InvokeWebService(serviceUrl, "", "HelloWorld", objects);
WebServiceHelper wbHelper = new WebServiceHelper();
InvokeWebServiceHandler webServiceHandler = new InvokeWebServiceHandler(wbHelper.InvokeWebService);//建立委託實例
string strWebServiceUrl="http://localhost:10974/WebServiceDemo.asmx";
object[] objects = new object[] { "king"};// 準備參數
webServiceHandler.BeginInvoke(strWebServiceUrl, "", "HelloWorld", objects,new AsyncCallback(CallBackMethod), webServiceHandler);//異步委託調用
// 請求WebService完成後,回調的方法
privatevoid CallBackMethod(IAsyncResult ar)
{
if (ar.IsCompleted == true)
{
string strData = dele.EndInvoke(ar).ToString();//獲取方法返回值
}
}