前言
在日常工作中,如果涉及到与第三方进行接口对接,有的会使用webservice的方式,这篇文章主要讲解在.net framework中如何调用webservice。
创建webservice
(1)新建项目——模板选择asp.net web 应用程序

(2)选择空项目模板

(3)右击项目-添加-web服务(asmx)

(4)新建后会自动生成一个测试服务helloworld并返回执行字符串

(5)点击运行,并调用返回

方法一:静态引用
这种方式是通过添加静态引用的方式调用webservice
1.首先创建一个winform程序,右击引用-添加服务引用。地址即为 运行的webservice地址,命名空间可自命名

2.设计winform窗体,可选择工具箱button调用,textbox入参

3.根据所需,调用webservice服务即可拿到返回参数

方法二:动态调用
上面使用静态引用的方式调用webservice,但是这种方式有一个缺点:如果发布的webservice地址改变,那么就要重新添加webservice的引用。如果是现有的webservice发生了改变,也要更新现有的服务引用,这需要把代码放到现场才可以。
使用动态调用webservice的方法可以解决该问题。
1.我们在配置文件里面添加配置,把webservice的地址、webservice提供的类名、要调用的方法名称,都写在配置文件里面

2.同样设计winform界面,添加按钮,调用webservice服务
添加帮助类
using system;
using system.codedom.compiler;
using system.codedom;
using system.collections.generic;
using system.io;
using system.linq;
using system.net;
using system.text;
using system.threading.tasks;
using system.xml.serialization;
using system.web;
using system.xml.serialization;
using system.web.caching;
using system.web.services.description;
namespace apitest1
{
internal class webservicehelper
{
/// <summary>
/// 生成dll文件保存到本地
/// </summary>
/// <param name="url">webservice地址</param>
/// <param name="classname">类名</param>
/// <param name="methodname">方法名</param>
/// <param name="filepath">保存dll文件的路径</param>
public static void createwebservicedll(string url, string classname, string methodname, string filepath)
{
// 1. 使用 webclient 下载 wsdl 信息。
webclient web = new webclient();
stream stream = web.openread(url + "?wsdl");
// 2. 创建和格式化 wsdl 文档。
servicedescription description = servicedescription.read(stream);
//如果不存在就创建file文件夹
if (directory.exists(filepath) == false)
{
directory.createdirectory(filepath);
}
if (file.exists(filepath + classname + "_" + methodname + ".dll"))
{
//判断缓存是否过期
var cachevalue = httpruntime.cache.get(classname + "_" + methodname);
if (cachevalue == null)
{
//缓存过期删除dll
file.delete(filepath + classname + "_" + methodname + ".dll");
}
else
{
// 如果缓存没有过期直接返回
return;
}
}
// 3. 创建客户端代理代理类。
servicedescriptionimporter importer = new servicedescriptionimporter();
// 指定访问协议。
importer.protocolname = "soap";
// 生成客户端代理。
importer.style = servicedescriptionimportstyle.client;
importer.codegenerationoptions = codegenerationoptions.generateproperties | codegenerationoptions.generatenewasync;
// 添加 wsdl 文档。
importer.addservicedescription(description, null, null);
// 4. 使用 codedom 编译客户端代理类。
// 为代理类添加命名空间,缺省为全局空间。
codenamespace nmspace = new codenamespace();
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 = filepath + classname + "_" + methodname + ".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");
// 生成dll文件,并会把webservice信息写入到dll里面
compilerresults result = provider.compileassemblyfromdom(parameter, unit);
if (result.errors.haserrors)
{
// 显示编译错误信息
system.text.stringbuilder sb = new stringbuilder();
foreach (compilererror ce in result.errors)
{
sb.append(ce.tostring());
sb.append(system.environment.newline);
}
throw new exception(sb.tostring());
}
//记录缓存
var objcache = httpruntime.cache;
// 缓存信息写入dll文件
objcache.insert(classname + "_" + methodname, "1", null, datetime.now.addminutes(5), timespan.zero, cacheitempriority.high, null);
}
/// <summary>
/// 根据webservice的url地址获取classname
/// </summary>
/// <param name="wsurl">webservice的url地址</param>
/// <returns></returns>
//private string getwsclassname(string wsurl)
//{
// string[] parts = wsurl.split('/');
// string[] pps = parts[parts.length - 1].split('.');
// return pps[0];
//}
}
}
3.动态调用webservice代码:
using system;
using system.collections.generic;
using system.componentmodel;
using system.configuration;
using system.data;
using system.drawing;
using system.io;
using system.linq;
using system.reflection;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace apitest1
{
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
private void button1_click(object sender, eventargs e)
{
// 读取配置文件,获取配置信息
string url = configurationmanager.appsettings["webserviceaddress"];
string classname = configurationmanager.appsettings["classname"];
string methodname = configurationmanager.appsettings["methodname"];
string filepath = configurationmanager.appsettings["filepath"];
// 调用webservicehelper
webservicehelper.createwebservicedll(url, classname, methodname, filepath);
// 读取dll内容
byte[] filedata = file.readallbytes(filepath + classname + "_" + methodname + ".dll");
// 加载程序集信息
assembly asm = assembly.load(filedata);
type t = asm.gettype(classname);
// 创建实例
object o = activator.createinstance(t);
methodinfo method = t.getmethod(methodname);
// 参数
string msgcode = textbox1.text;
string sendxml = textbox2.text;
//string usercode = textbox3.text;
object[] args = { msgcode, sendxml};
//object[] args = { "动态调用webservice" };
// 调用访问,获取方法返回值
string value = method.invoke(o, args).tostring();
//输出返回值
messagebox.show($"返回值:{value}");
}
}
}
程序运行结果

如果说类名没有提供,可以根据url来自动获取类名:
见帮助类(webservicehelper)中getwsclassname 方法。
到此这篇关于c#调用webservice的方法步骤的文章就介绍到这了,更多相关c#调用webservice内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论