看到很多動態調用WebService都只是動態調用地址而已
webservice還是同一個才行
如果換另外的一個不同的webservice
則需重新生成代理類
下面的例子
稍加修改可以做到只修改配置文件而適應不同的webservice
主要原理是根據指定的WebService地址的WSDL
然後解析模擬生成一個代理類
通過反射調用裡面的方法
具體看代碼
下面是WebService代碼
using System;
using System
Collections
Generic;
using System
Linq;
using System
Web;
using System
Web
Services;
namespace TestWebService
{
/// <summary>
/// Service
的摘要說明
/// </summary>
[WebService(Namespace =
Description =
我的Web服務
)]
[WebServiceBinding(ConformsTo = WsiProfiles
BasicProfile
_
)]
[System
ComponentModel
ToolboxItem(false)]
// 若要允許使用 ASP
NET AJAX 從腳本中調用此 Web 服務
請取消對下行的注釋
// [System
Web
Script
Services
ScriptService]
public class TestWebService : System
Web
Services
WebService
{
[WebMethod]
public string HelloWorld()
{
return
測試Hello World
;
}
[WebMethod]
public string Test()
{
return
測試Test
;
}
[WebMethod(CacheDuration =
Description =
測試
)]
public List<String> GetPersons()
{
List<String> list = new List<string>();
list
Add(
測試一
);
list
Add(
測試二
);
list
Add(
測試三
);
return list;
}
}
}
下面是客戶端的代碼
客戶端:
using System;
using System
IO;
using System
Collections
Generic;
using System
Linq;
using System
Collections;
using System
Web;
using System
Net;
using System
Reflection;
using System
CodeDom;
using System
CodeDom
Compiler;
using System
Web
Services;
using System
Text;
using System
Web
Services
Description;
using System
Web
Services
Protocols;
using System
Xml
Serialization;
using System
Windows
Forms;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
WebClient client = new WebClient();
String url =
;//這個地址可以寫在Config文件裡面
這裡取出來就行了
在原地址後面加上
?WSDL
Stream stream = client
OpenRead(url);
ServiceDescription description = ServiceDescription
Read(stream);
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//創建客戶端代理代理類
importer
ProtocolName =
Soap
; //指定訪問協議
importer
Style = ServiceDescriptionImportStyle
Client; //生成客戶端代理
importer
CodeGenerationOptions = CodeGenerationOptions
GenerateProperties | CodeGenerationOptions
GenerateNewAsync;
importer
AddServiceDescription(description
null
null); //添加WSDL文檔
CodeNamespace nmspace = new CodeNamespace(); //命名空間
nmspace
Name =
TestWebService
;
CodeCompileUnit unit = new CodeCompileUnit();
unit
Namespaces
Add(nmspace);
ServiceDescriptionImportWarnings warning = importer
Import(nmspace
unit);
CodeDomProvider provider = CodeDomProvider
CreateProvider(
CSharp
);
CompilerParameters parameter = new CompilerParameters();
parameter
GenerateExecutable = false;
parameter
OutputAssembly =
MyTest
dll
;//輸出程序集的名稱
parameter
ReferencedAssemblies
Add(
System
dll
);
parameter
ReferencedAssemblies
Add(
System
XML
dll
);
parameter
ReferencedAssemblies
Add(
System
Web
Services
dll
);
parameter
ReferencedAssemblies
Add(
System
Data
dll
);
CompilerResults result = provider
CompileAssemblyFromDom(parameter
unit);
if (result
Errors
HasErrors)
{
// 顯示編譯錯誤信息
}
Assembly asm = Assembly
LoadFrom(
MyTest
dll
);//加載前面生成的程序集
Type t = asm
GetType(
TestWebService
TestWebService
);
object o = Activator
CreateInstance(t);
MethodInfo method = t
GetMethod(
GetPersons
);//GetPersons是服務端的方法名稱
你想調用服務端的什麼方法都可以在這裡改
最好封裝一下
String[] item = (String[])method
Invoke(o
null);
//注
method
Invoke(o
null)返回的是一個Object
如果你服務端返回的是DataSet
這裡也是用(DataSet)method
Invoke(o
null)轉一下就行了
method
Invoke(
null)這裡的null可以傳調用方法需要的參數
string[]形式的
foreach (string str in item)
Console
WriteLine(str);
//上面是根據WebService地址
模似生成一個代理類
如果你想看看生成的代碼文件是什麼樣子
可以用以下代碼保存下來
默認是保存在bin目錄下面
TextWriter writer = File
CreateText(
MyTest
cs
);
provider
GenerateCodeFromCompileUnit(unit
writer
null);
writer
Flush();
writer
Close();
}
}
}
From:http://tw.wingwit.com/Article/program/net/201311/12362.html