您的位置:首页 > 其它

动态调用WebService方法

2010-11-01 20:41 405 查看
原文:http://topic.csdn.net/u/20090220/10/08c8ca6f-3733-40ff-840e-d6ca6894ab35.html

好像很多人做WebService的时候都是直接添加引用的方式,然后调用服务端的方法.这样就个问题,就是每次我服务端添加了方法或者修改了方法后都要
更新Web引用,这样比较麻烦.下面给一个不用添加引用的方式调用服务端的方法.只是一个简单的测试,不是很规范,用得着的人可以自己封装一下,然后直接
传服务端的方法名进去,Type.GetMethod获取方法,然后method.Invoke返回结果

高手些多多包函,主要是给用得着的人参考一下,互相学习.代码主要是用了 System.Web.Services.Description里的东西

新建一个WebService项目,添加以下代码:

C# code

using
System;

using
System.Collections.Generic;

using
System.Linq;

using
System.Web;

using
System.Web.Services;

namespace
TestWebService

{

///

<summary>

///
Service1 的摘要说明

///

</summary>

[WebService(Namespace
=

" http://tempuri.org/ "
,Description
=
"
我的Web服务
"
)]

[WebServiceBinding(ConformsTo
=
WsiProfiles.BasicProfile1_1)]

[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
=

60
,Description
=

"
测试
"
)]

public
List
<
String
>
GetPersons()

{

List
<
String
>
list
=

new
List
<
string
>
();

list.Add(
"
测试一
"
);

list.Add(
"
测试二
"
);

list.Add(
"
测试三
"
);

return
list;

}

}

}


下面是客户端:

C# code

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
ConsoleApplication1

{

class
Program

{

static

void
Main(
string
[] args)

{

WebClient client
=

new
WebClient();

String url
=

" http://localhost:3182/Service1.asmx?WSDL "
;
//
这个地址可以写在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)转一下就行了

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();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: