一、在ASP.NET中创建WebService

首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例

点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加

这样我们基础的WebService就创建好了

接下来我们填加一个webservice的测试方法,并且打上特性标签WebMethod

只有打上特性标签WebMethod并且访问修饰符设置为public后外部才能调用到该方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services; namespace TianYa.DotNetShare.WebServiceDemo
{
/// <summary>
/// WebServiceTest 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
// [System.Web.Script.Services.ScriptService]
public class WebServiceTest : System.Web.Services.WebService
{ [WebMethod]
public string HelloWorld()
{
return "Hello World";
} /// <summary>
/// WebService测试方法
/// </summary>
/// <param name="paramIn">入参</param>
/// <param name="paramOut">出参</param>
/// <returns>返回值</returns>
[WebMethod(Description = "WebService测试方法")]
public string SayHello(string paramIn, ref string paramOut)
{
paramOut = string.Format("Hello {0}!", paramIn);
return "Success";
}
}
}

到此我们的WebService就创建完毕了,很简单吧!

二、将创建的WebService部署到我们的IIS上面

其实WebService部署和我们的网站部署是一样的,下面就简单的介绍下

首先我们需要先配置域名解析,修改hosts文件

hosts文件路径:C:\Windows\System32\drivers\etc

以记事本方式打开,配置方式如下,格式:127.0.0.1 一个空格 自定义的域名 ,配置完成后记得保存

接下来我们添加一个公用的应用程序池,点击“应用程序池”右键“添加应用程序池”

选择完后点击确定,然后点击生成的应用程序池右键选择高级设置,将标识改成LocalSystem,点击确定

设置完成后效果如下

最后就是添加网站了,点击“网站”右键选择“添加网站”

物理路径就是指我们的项目路径,弄完后点击确定

到此我们的WebService就全部部署好了,下面测试一下是否成功

浏览器访问正常,说明我们WebService部署成功啦!

三、通过反射动态调用WebService

此处为了演示,首先我们添加一个WebService的帮助类WebServiceHelper.cs

具体代码如下:

using System;
using System.Net;
using System.IO;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services.Description; //需导入System.Web.Services程序集(添加引用)
using Microsoft.CSharp; namespace TianYa.DotNetShare.WebServiceDemo
{
public static class WebServiceHelper
{
#region 通过反射动态调用WebService #region 调用示例
/************************************************************************************
*
* WebService方法:
* [WebMethod(Description = "WebService测试方法")]
* public string SayHello(string paramIn,ref string paramOut)
* {
* paramOut = string.Format("Hello {0}!", paramIn);
* return "Success";
* }
*
* 调用示例如下:
* object[] objs = new object[] { "张三", "" }; //入参
* var webServiceUrl = "http://TianYa.DotNetShare.WebServiceDemo/WebServiceTest.asmx";
* object result = WebServiceHelper.InvokeWebService(webServiceUrl, "SayHello", objs); //返回结果
* object paramOut = objs[1]; //出参
*
************************************************************************************/
#endregion /// <summary>
/// 通过反射动态调用WebService
/// </summary>
/// <param name="webServiceUrl">WebServices地址</param>
/// <param name="methodName">调用的方法名</param>
/// <param name="args">把调用WebService时需要的参数按顺序放到这个object[]里,如果无参数传null</param>
/// <returns>返回调用WebService的返回值,如果调用出错则返回null</returns>
public static object InvokeWebService(string webServiceUrl, string methodName, params object[] args)
{
//这里的namespace是需要引用的WebService的命名空间,不用改也可以正常使用。也可以加一个参数从外面传进来。
string @namespace = "client"; try
{
//判断webServiceUrl中末尾是否包含“?WSDL”,如果不包含则添加
if (webServiceUrl != null && !webServiceUrl.Equals(""))
{
if (webServiceUrl.LastIndexOf("?") > -)
{
if (webServiceUrl.ToUpper().LastIndexOf("WSDL") <= -)
{
webServiceUrl = webServiceUrl + "WSDL";
}
}
else
{
webServiceUrl = webServiceUrl + "?WSDL";
}
} //获取WSDL
WebClient wc = new WebClient();
Stream stream = wc.OpenRead(webServiceUrl);
ServiceDescription sd = ServiceDescription.Read(stream);
string className = sd.Services[].Name;
ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
sdi.AddServiceDescription(sd, "", "");
CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(cn);
sdi.Import(cn, ccu);
CSharpCodeProvider csc = new CSharpCodeProvider();
//ICodeCompiler icc = csc.CreateCompiler(); //设定编译参数
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 (true == cr.Errors.HasErrors)
{
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());
} //生成代理实例,并调用方法
System.Reflection.Assembly assembly = cr.CompiledAssembly;
Type t = assembly.GetType(@namespace + "." + className, true, true);
object obj = Activator.CreateInstance(t);
System.Reflection.MethodInfo mi = t.GetMethod(methodName); //注:method.Invoke(obj, null)返回的是一个Object,
//如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(obj, null)转一下就行了,
//method.Invoke(obj,null)这里的null可以传调用方法需要的参数,string[]形式的
return mi.Invoke(obj, args);
}
catch (Exception ex)
{
//异常日志处理
return null;
}
}
#endregion
}
}

在Index页面调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace TianYa.DotNetShare.WebServiceDemo
{
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//调用示例如下:
object[] objs = new object[] { "张三", "" }; //入参
var webServiceUrl = "http://TianYa.DotNetShare.WebServiceDemo/WebServiceTest.asmx";
object result = WebServiceHelper.InvokeWebService(webServiceUrl, "SayHello", objs); //返回结果
object paramOut = objs[]; //出参 Response.Write($"调用结果result:{result}<br/>出参结果paramOut:{paramOut}");
}
}
}

页面输出结果:

至此就全部介绍完了,如果你觉得这篇文章对你有所帮助请记得点赞哦,谢谢!!!

WebService的Demo源码:

链接:https://pan.baidu.com/s/1dFYNVYNw3a_4TKwwSToadA
提取码:feg8

参考博文:https://www.cnblogs.com/atree/p/WebService_dynamic.html

版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!

ASP.NET中WebService的创建和部署以及通过反射动态调用WebService的更多相关文章

  1. Asp.net动态调用WebService

    Public Class WebServiceHelper #Region "InvokeWebService" '动态调用web服务 Public Shared Function ...

  2. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  3. C# .NET 动态调用webservice的三种方式

    转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...

  4. 用C#通过反射实现动态调用WebService 告别Web引用

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  5. 动态调用WebService(C#)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  6. 用C#通过反射实现动态调用WebService 告别Web引用(转载)

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  7. 动态调用webservice及WCF服务

    动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...

  8. WebService – 2.动态调用WebService

    在本节课程中,将演示如何通过程序动态添加.调用.编译.执行WebService并返回结果. WebService动态调用示意图 WebService相关知识 代码文档对象模型CodeDom的使用 编程 ...

  9. NET动态调用WebService

    NET动态调用WebService 这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比 ...

随机推荐

  1. javascript中的toString()

    基本介绍 javascript中的toString方法是我们在写前端时经常要用的一个函数,也就是将我们的变量转换成字符串的方法. javascript中各种类型的toString方法 javascri ...

  2. Glide缓存流程

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/cPLkefpEb3w12-uoiqzTig作者:连凌能 Android上图片加载的解决方案有多 ...

  3. Tuple<T1,T2,.........T> 元组简单使用

    元组:一个数据结构,逗号分隔,用于传递一个程序或者操作系统的一系列值得组合 NET Framework直接支持一至七元素得数组 Tuple<T1> Tuple<T1,T2> T ...

  4. 一种简单的REST API接口加密实现,只允许自己的产品调用后台,防止接口被刷

    在项目上线后,后台接口很容易通过抓包工具看到, 难免被人为构造恶意请求攻击我们的系统,相信大家都或多或少都遇到过短信验证码被刷.疯狂留言灌水.数据被恶意爬取等问题,这种直接抓接口然后写个循环调用的行为 ...

  5. Pandas:DataFrame数据选择方法(索引)

    #首先创建我们的Series对象,然后合并到dataframe对象里面去 import pandas as pd import numpy as np area=pd.Series({,,,}) po ...

  6. IntelliJ IDEA搭建Spring Boot 2 项目入门

    之前都是用Eclipse,今天试了下IntelliJ IDEA,搭建了一个Spring Boot 2的Hello world项目. 一.IntelliJ IDEA 下载安装 官网下载:https:// ...

  7. 模块二之序列化模块以及collections模块

    模块二之序列化模块以及collections模块 一.序列化模块 json模块 ''' 序列化:将python或其他语言的数据类型转换成字符串类型 json模块: 是一个序列化模块. json: 是一 ...

  8. Centos7_防火墙的常用配置(杂记)

    Centos6和Centos7防火墙的区别 使用的工具不一样,Centos6使用的是Iptables而Centos7使用的则是Firewall Iptables,用于过滤数据包,属于网络层防火墙 Fi ...

  9. HTML5常见的取值与单位

    HTML5常见的取值与单位     长度单位包括 相对长度单位包括:em, ex, ch, rem, vw, vh, vmax, vmin 绝对长度单位包括:cm, mm, q, in, pt, pc ...

  10. 使用STS4新建springboot项目

    1.配置maven,自定义setting文件和仓库,一定要用阿里云镜像地址下载依赖,官方太坑了,整了半天都没弄好,原来是下载太慢文件损坏 <mirror> <id>alimav ...