原文:C#调用WebService服务(动态调用)

1 创建WebService

using System;
using System.Web.Services; namespace WebService1
{
/// <summary>
/// Service1 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/", Description="测试服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
{ [WebMethod(Description="Hello World")]
public string HelloWorld()
{
return "Hello World";
} [WebMethod(Description="A加B")]
public int Add(int a, int b)
{
return a + b;
} [WebMethod(Description="获取时间")]
public string GetDate()
{
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
}
}

服务创建后,在浏览器中输入服务地址,可以看到如下图所示。

2 通过Visual Studio添加服务引用

通过Visual Studio添加服务引用相当方便,只需要在Visual Studio中选择添加服务引用,便可以生成代理类,在项目中通过代理调用服务,如下图所示。

添加服务引用以后,在项目解决方案中多了Service References和app.config,如下图所示。

ServiceReference1就是上面添加的服务,app.config是服务的配置文件,app.config里面的配置大致如下,当服务地址改变时,修改endpoint里的address即可。

<!--app.config文件配置-->
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:19951/Service1.asmx" binding="basicHttpBinding"
bindingConfiguration="Service1Soap" contract="ServiceReference1.Service1Soap"
name="Service1Soap" />
</client>
</system.serviceModel>
</configuration>

客户端调用WebService

//调用服务,结果如图所示。
static void Main(string[] args)
{
ServiceReference1.Service1SoapClient client = new ServiceReference1.Service1SoapClient(); //调用服务的HelloWorld方法
string hello = client.HelloWorld();
Console.WriteLine("调用服务HelloWorld方法,返回{0}", hello); //调用服务的Add方法
int a = 1, b = 2;
int add = client.Add(a, b);
Console.WriteLine("调用服务Add方法,{0} + {1} = {2}", a, b, add); //调用服务的GetDate方法
string date = client.GetDate();
Console.WriteLine("调用服务GetDate方法,返回{0}", date); Console.ReadKey();
}

3 动态调用服务(转自http://www.cnblogs.com/prolifes/articles/1235685.html)

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Net;
using System.Reflection;
using System.Web.Services.Description;
using Microsoft.CSharp; static void Main(string[] args)
{
//服务地址,该地址可以放到程序的配置文件中,这样即使服务地址改变了,也无须重新编译程序。
string url = "http://localhost:19951/Service1.asmx"; //客户端代理服务命名空间,可以设置成需要的值。
string ns = string.Format("ProxyServiceReference"); //获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(url + "?WSDL");
ServiceDescription sd = ServiceDescription.Read(stream);//服务的描述信息都可以通过ServiceDescription获取
string classname = sd.Services[0].Name; ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(ns); //生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider(); //设定编译参数
CompilerParameters cplist = new CompilerParameters();
cplist.GenerateExecutable = false;
cplist.GenerateInMemory = true;
cplist.ReferencedAssemblies.Add("System.dll");
cplist.ReferencedAssemblies.Add("System.XML.dll");
cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类
CompilerResults cr = csc.CompileAssemblyFromDom(cplist, ccu);
if (cr.Errors.HasErrors == true)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
{
sb.Append(ce.ToString());
sb.Append(System.Environment.NewLine);
}
throw new Exception(sb.ToString());
} //生成代理实例,并调用方法
Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(ns + "." + classname, true, true);
object obj = Activator.CreateInstance(t); ////////////////////////////////////////////////////////////////////////////////////
//调用HelloWorld方法
MethodInfo helloWorld = t.GetMethod("HelloWorld");
object helloWorldReturn = helloWorld.Invoke(obj, null);
Console.WriteLine("调用HelloWorld方法,返回{0}", helloWorldReturn.ToString()); //获取Add方法的参数
ParameterInfo[] helloWorldParamInfos = helloWorld.GetParameters();
Console.WriteLine("HelloWorld方法有{0}个参数:", helloWorldParamInfos.Length);
foreach (ParameterInfo paramInfo in helloWorldParamInfos)
{
Console.WriteLine("参数名:{0},参数类型:{1}", paramInfo.Name, paramInfo.ParameterType.Name);
} //获取HelloWorld返回的数据类型
string helloWorldReturnType = helloWorld.ReturnType.Name;
Console.WriteLine("HelloWorld返回的数据类型是{0}", helloWorldReturnType); ////////////////////////////////////////////////////////////////////////////////////
Console.WriteLine("\n==============================================================");
//调用Add方法
MethodInfo add = t.GetMethod("Add");
int a = 10, b = 20;//Add方法的参数
object[] addParams = new object[]{a, b};
object addReturn = add.Invoke(obj, addParams);
Console.WriteLine("调用HelloWorld方法,{0} + {1} = {2}", a, b, addReturn.ToString()); //获取Add方法的参数
ParameterInfo[] addParamInfos = add.GetParameters();
Console.WriteLine("Add方法有{0}个参数:", addParamInfos.Length);
foreach (ParameterInfo paramInfo in addParamInfos)
{
Console.WriteLine("参数名:{0},参数类型:{1}", paramInfo.Name, paramInfo.ParameterType.Name);
} //获取Add返回的数据类型
string addReturnType = add.ReturnType.Name;
Console.WriteLine("Add返回的数据类型:{0}", addReturnType); ////////////////////////////////////////////////////////////////////////////////////
Console.WriteLine("\n==============================================================");
//调用GetDate方法
MethodInfo getDate = t.GetMethod("GetDate");
object getDateReturn = getDate.Invoke(obj, null);
Console.WriteLine("调用GetDate方法,返回{0}", getDateReturn.ToString()); //获取GetDate方法的参数
ParameterInfo[] getDateParamInfos = getDate.GetParameters();
Console.WriteLine("GetDate方法有{0}个参数:", getDateParamInfos.Length);
foreach (ParameterInfo paramInfo in getDateParamInfos)
{
Console.WriteLine("参数名:{0},参数类型:{1}", paramInfo.Name, paramInfo.ParameterType.Name);
} //获取Add返回的数据类型
string getDateReturnType = getDate.ReturnType.Name;
Console.WriteLine("GetDate返回的数据类型:{0}", getDateReturnType); Console.WriteLine("\n\n==============================================================");
Console.WriteLine("服务信息");
Console.WriteLine("服务名称:{0},服务描述:{1}", sd.Services[0].Name, sd.Services[0].Documentation);
Console.WriteLine("服务提供{0}个方法:", sd.PortTypes[0].Operations.Count);
foreach (Operation op in sd.PortTypes[0].Operations)
{
Console.WriteLine("方法名称:{0},方法描述:{1}", op.Name, op.Documentation);
} Console.ReadKey();
}

C#调用WebService服务(动态调用)的更多相关文章

  1. 调用webservice服务(通过反射的方式动态调用)

    调用 ";//系统类别 var jkxlh = "";//接口序列号 var jkid = "68W05";//接口id string WriteXm ...

  2. WebService-01-使用jdk发布第一个WebService服务并调用

    Webservice是SOAP+XML,SOAP是基于Http的,Http底层是Socket,先回顾一下Socket: Server: public class Server { public sta ...

  3. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】

    不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...

  4. 使用ajax和urlconnection方式调用webservice服务

    <html> <head> <title>使用ajax方式调用webservice服务</title> <script> var xhr = ...

  5. ajax调用webservice服务

    ajax调用是 html方向调用的, 而sqlconnection是 java代码调用的,本质差不多 <html> <head> <title>通过ajax调用we ...

  6. sqlconnection 调用webservice服务

    package cn.itcast.service.urlconnection; import java.io.InputStream; import java.io.OutputStream; im ...

  7. 问题:C#调webservice超时;结果:C#调用webservice服务超时

    C#调用WebService服务时,报错,The operation has timed out,意思是“操作超时”. 方法/步骤 首先修改服务端配置 WebService服务所在站点为服务端,它提供 ...

  8. C# - VS2019 WinFrm应用程序调用WebService服务

    WinFrm应用程序调用WebService服务 关于WebService的创建.发布与部署等相关操作不再赘述,传送门如下:C# VS2019 WebService创建与发布,并部署到Windows ...

  9. Webservice客户端动态调用服务端功能方法

    一.发布WebService服务 方式一:在服务端生成wsdl文件,下方客户端直接引用即可     优点:针对要发布的方法生成一个wsdl文件即可,无需多余配置.   缺点:每次服务端方法发生改变都需 ...

随机推荐

  1. 黑马程序员_JavaIO流(四)

    File概述 File类 用来将文件或者文件夹封装成对象. 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递给流的构造函数. 了解File类中的常用方法. 字段:static St ...

  2. Android UI 之TextView控件属性列表

    在网上收集到了TextView 的属性,在开发过程中还是挺有用的. android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(non ...

  3. 为什么使用Redis

    原文地址:http://igoder.iteye.com/blog/1969848 先解释一下软件编程中常见的一些概念: 抽象先于具象.这个抽象并非虚无的抽象,而是指事物尚未分化为具象之前的那个前体存 ...

  4. HDU5196--DZY Loves Inversions 树状数组 逆序数

    题意查询给定[L, R]区间内 逆序对数 ==k的子区间的个数. 我们只需要求出 子区间小于等于k的个数和小于等于k-1的个数,然后相减就得出答案了. 对于i(1≤i≤n),我们计算ri表示[i,ri ...

  5. Java设计模式之简单工厂、工厂方法和抽象工厂

    在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...

  6. tomcat+redis实现session共享缓存

    一:linux下redis安装 1.wget http://download.redis.io/releases/redis-3.2.4.tar.gz 2.tar xzf redis-3.2.4.ta ...

  7. css文本样式

    1. body{ color:aqua; /*可继承的颜色*/ text-align: center; /*文本对齐方式*/ } 2.缩进: index.html <!DOCTYPE html& ...

  8. java jodd轻量级开发框架

    http://git.oschina.net/huangyong/jodd_demo/blob/master/jodd-example/src/main/java/jodd/example/servi ...

  9. 【录音】Android录音--AudioRecord、MediaRecorder

    Android提供了两个API用于实现录音功能:android.media.AudioRecord.android.media.MediaRecorder. 网上有很多谈论这两个类的资料.现在大致总结 ...

  10. git开源项目协作

    开源项目协作 fork开源项目,即打开开源项目的github,然后点击fork按钮 pull request