博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态调用WebService方法
阅读量:5039 次
发布时间:2019-06-12

本文共 3919 字,大约阅读时间需要 13 分钟。

 
好像很多人做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();
}
}
}

转载于:https://www.cnblogs.com/lykbk/p/ggejjgergjejigeiogjiei3490534934953405.html

你可能感兴趣的文章
selenium安装及官方文档
查看>>
【SVN】导出项目后报错汇总
查看>>
使用Redis存取数据+数据库存取(spring+java)
查看>>
MySQL教程(六)—— 数据库的创建与删除
查看>>
2018.11.24 poj2774Long Long Message(后缀数组)
查看>>
Python之路【第十六篇】Django基础
查看>>
nyoj 最长公共子序列(LCS)
查看>>
java基础 三 概念和java程序的结构.
查看>>
jedis应用实例
查看>>
Netty实战八之引导
查看>>
如何做一个自己的开源聊天项目?(仿微信)
查看>>
C#异步编程
查看>>
XML的简单读取与写入
查看>>
关于dojo模块化引入包的问题
查看>>
Linux下 网卡测速
查看>>
17秋 软件工程 团队第五次作业 Alpha Scrum1
查看>>
17秋 软件工程 团队第五次作业 Alpha 测试报告
查看>>
js 定时器
查看>>
iOS CoreAnimate 动画实现
查看>>
BZOJ5300 [Cqoi2018]九连环 【dp + 高精】
查看>>