概述
WebService 的调用分为静态调用和动态调用两种。
静态:根据写死的服务地址调用服务。
动态:根据传入的不同地址调用对应的服务。
1、静态调用
静态调用的方式是通过“Add Service Reference...”创建客户端代理类。
这种方式让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。
这样是使工作简单了,但是却将提供Web服务的URL、方法名、参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制。
如果发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译。
此方法可参考链接:https://www.cnblogs.com/anbylau2130/p/3481659.html
或者参考:https://blog.csdn.net/han_better/article/details/81503910
方法是:在资源管理器中点击右键,选择【添加服务引用】,点击 【高级】,【添加WEB引用】,调出对话框:
》
》
【WEB引用名】 根据需要可以自己改,最后点击 【添加引用】
下面我们来看调用:
即 sum 就是我们得到的值
2、动态调用
思路:
1)从目标 URL 下载 WSDL 数据;
2)使用 ServiceDescription 创建和格式化 WSDL 文档文件;
3)使用 ServiceDescriptionImporter 创建客户端代理类;
4)使用 CodeDom 动态创建客户端代理类程序集;
5)利用反射调用相关 WebService 方法。
参考地址:https://blog.csdn.net/ysq5202121/article/details/6942813
单独创建一个类
首先增加如下引用:
上述步骤需要引用如下四个名称空间:
using System.Web.Services.Description; //WS的描述
//以下几个用于根据描述动态生成代码并动态编译获取程序集
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Net;
using System.Web.Services.Description;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
namespace WindowsServiceWebDefaultHotCity
{
/// <summary<
/// WebService代理类
/// </summary<
public class WebServiceAgent
{
private object agent;
private Type agentType;
//这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。
private const string CODE_NAMESPACE = "Beyondbit.WebServiceAgent.Dynamic";
/// <summary<
/// 构造函数
/// </summary<
/// <param name="url"<</param<
public WebServiceAgent(string url)
{
XmlTextReader reader = new XmlTextReader(url + "?wsdl");
//创建和格式化 WSDL 文档
ServiceDescription sd = ServiceDescription.Read(reader);
//创建客户端代理代理类
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, null, null);
//使用 CodeDom 编译客户端代理类
CodeNamespace cn = new CodeNamespace(CODE_NAMESPACE);
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
Microsoft.CSharp.CSharpCodeProvider icc = new Microsoft.CSharp.CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);
agentType = cr.CompiledAssembly.GetTypes()[0];
agent = Activator.CreateInstance(agentType);
}
///<summary<
///调用指定的方法
///</summary<
///<param name="methodName"<方法名,大小写敏感</param<
///<param name="args"<参数,按照参数顺序赋值</param<
///<returns<Web服务的返回值</returns<
public object Invoke(string methodName, params object[] args)
{
MethodInfo mi = agentType.GetMethod(methodName);
return this.Invoke(mi, args);
}
///<summary<
///调用指定方法
///</summary<
///<param name="method"<方法信息</param<
///<param name="args"<参数,按照参数顺序赋值</param<
///<returns<Web服务的返回值</returns<
public object Invoke(MethodInfo method, params object[] args)
{
return method.Invoke(agent, args);
}
public MethodInfo[] Methods
{
get
{
return agentType.GetMethods();
}
}
}
}
调用:
//指定地址,因为是动态的,可从文件中读取,或者动态指定。例如:
private string _url = "http://www.baidu.com";
//创建实例,将服务需要的参数保存,根据实际的参数个数来定义~
object[] args = new object[3];
args[0] = "第一个参数";
args[1] = "第二个参数";
args[2] = "第三个参数";
WindowsServiceWebDefaultHotCity.WebServiceAgent agent = new WindowsServiceWebDefaultHotCity.WebServiceAgent(_url);
string text=agent.Invoke("服务名", args).ToString();
这个方法到此结束。
3、根据WSDL文件生成WebService服务端代码
根据提供的wsdl生成webservice代理类,然后在代码里引用这个类文件。
步骤:
1、在开始菜单找到 Microsoft Visual Studio 下面的Visual Studio Tools , 点击Visual Studio 命令提示,打开命令行。
2、 在命令行中输入: wsdl /language:c# /n:TestDemo /out:d:/Temp/TestService.cs http://jm1.services.gmcc.net/ad/Services/AD.asmx?wsdl
这句命令行的意思是:对最后面的服务地址进行编译,在D盘temp 目录下生成testservice文件。
3、 把上面命令编译后的cs文件,复制到我们项目中,在项目代码中可以直接new 一个出来后,可以进行调用。
参考地址:https://blog.csdn.net/slimboy123/article/details/4344914
或者:
参考地址:https://www.cnblogs.com/anbylau2130/p/3481804.html
4、其它方法
参考地址:https://www.cnblogs.com/leolion/p/4757320.html
最后
以上就是认真烧鹅为你收集整理的C#编程,调用(静态、动态) Web Service 的一种方法。的全部内容,希望文章能够帮你解决C#编程,调用(静态、动态) Web Service 的一种方法。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复