ASP.NET中WebService的创建和部署以及通过反射动态调用WebService
<h3>一、在ASP.NET中创建WebService</h3><p>首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例</p>
<p><div align="center"></div></p>
<p><div align="center"></div></p>
<p>点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加</p>
<p><div align="center"></div></p>
<p>这样我们基础的WebService就创建好了</p>
<p><div align="center"></div></p>
<p>接下来我们填加一个webservice的测试方法,而且打上特性标签WebMethod</p>
<p>只有打上特性标签WebMethod而且访问修饰符设置为public后外部才能调用到该方法</p>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace TianYa.DotNetShare.WebServiceDemo
{
/// <summary>
/// WebServiceTest 的摘要阐明
/// </summary>
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
//
public class WebServiceTest : System.Web.Services.WebService
{
public string HelloWorld()
{
return "Hello World";
}
/// <summary>
/// WebService测试方法
/// </summary>
/// <param name="paramIn">入参</param>
/// <param name="paramOut">出参</param>
/// <returns>返回值</returns>
public string SayHello(string paramIn, ref string paramOut)
{
paramOut = string.Format("Hello {0}!", paramIn);
return "Success";
}
}
}
<p>到此我们的WebService就创建完毕了,很简朴吧!</p>
<h3>二、将创建的WebService摆设到我们的IIS上面</h3>
<p>其实WebService摆设和我们的网站摆设是一样的,下面就简朴的介绍下</p>
<p>首先我们需要先配置域名剖析,修改hosts文件</p>
hosts文件路径:C:\Windows\System32\drivers\etc
<p><div align="center"></div></p>
<p>以记事本方式打开,配置方式如下,格式:127.0.0.1 一个空格 自界说的域名 ,配置完成后记得保存</p>
<p><div align="center"></div></p>
<p>接下来我们添加一个公用的应用程序池,点击“应用程序池”右键“添加应用程序池”</p>
<p><div align="center"></div></p>
<p>选择完后点击确定,然后点击生成的应用程序池右键选择高级设置,将标识改成LocalSystem,点击确定</p>
<p><div align="center"></div></p>
<p>设置完成后效果如下</p>
<p><div align="center"></div></p>
<p>末了就是添加网站了,点击“网站”右键选择“添加网站”</p>
<p><div align="center"></div></p>
<p>物理路径就是指我们的项目路径,弄完后点击确定</p>
<p><div align="center"></div></p>
<p>到此我们的WebService就全部摆设好了,下面测试一下是否成功</p>
<p><div align="center"></div></p>
<p>浏览器访问正常,阐明我们WebService摆设成功啦!</p>
<h3>三、通过反射动态调用WebService</h3>
<p>此处为了演示,首先我们添加一个WebService的帮助类WebServiceHelper.cs</p>
<p><div align="center"></div></p>
<p>具体代码如下:</p>
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方法:
*
* 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; //出参
*
************************************************************************************/
#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("?") > -1)
{
if (webServiceUrl.ToUpper().LastIndexOf("WSDL") <= -1)
{
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
}
}
<p>在Index页面调用</p>
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}");
}
}
}
<p>页面输出结果:</p>
<p><div align="center"></div></p>
<p>至此就全部介绍完了,如果你觉得这篇文章对你有所帮助请记得点赞哦,谢谢!!!</p>
<p> WebService的Demo源码:</p>
<p>链接:https://pan.baidu.com/s/1dFYNVYNw3a_4TKwwSToadA <br />提取码:feg8</p>
<p> </p>
<p>参考博文:https://www.cnblogs.com/atree/p/WebService_dynamic.html<br /></p>
<p><strong>版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!</strong></p><br>来源:<a href="https://www.cnblogs.com/xyh9039/p/11295528.html" target="_blank">https://www.cnblogs.com/xyh9039/p/11295528.html</a><br>免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]