请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 84|回复: 0

ASP.NET中WebService的创建和部署以及通过反射动态调用WebService

[复制链接]
  • TA的每日心情
    开心
    前天 19:06
  • 签到天数: 1469 天

    [LV.10]以坛为家III

    1177

    主题

    3082

    帖子

    9万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    94058

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2019-8-13 19:07:59 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

    一、在ASP.NET中创建WebService

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

    191012qzk1rofn5avf4r4i.png

    191012qrmz0plhzmeg5e06.png

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

    191013xbnys05sayjzts89.png

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

    191014ty8bol3m90rojwbc.png

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

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

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.Services;
    6. namespace TianYa.DotNetShare.WebServiceDemo
    7. {
    8. /// <summary>
    9. /// WebServiceTest 的摘要阐明
    10. /// </summary>
    11. [WebService(Namespace = "http://tempuri.org/")]
    12. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    13. [System.ComponentModel.ToolboxItem(false)]
    14. // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
    15. // [System.Web.Script.Services.ScriptService]
    16. public class WebServiceTest : System.Web.Services.WebService
    17. {
    18. [WebMethod]
    19. public string HelloWorld()
    20. {
    21. return "Hello World";
    22. }
    23. /// <summary>
    24. /// WebService测试方法
    25. /// </summary>
    26. /// <param name="paramIn">入参</param>
    27. /// <param name="paramOut">出参</param>
    28. /// <returns>返回值</returns>
    29. [WebMethod(Description = "WebService测试方法")]
    30. public string SayHello(string paramIn, ref string paramOut)
    31. {
    32. paramOut = string.Format("Hello {0}!", paramIn);
    33. return "Success";
    34. }
    35. }
    36. }
    复制代码

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

    二、将创建的WebService摆设到我们的IIS上面

    其实WebService摆设和我们的网站摆设是一样的,下面就简朴的介绍下

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

    1. hosts文件路径:C:\Windows\System32\drivers\etc
    复制代码

    191014cni4tvtq4ujvia7t.png

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

    191015f9qrku525rtnjvzo.png

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

    191016bhnonox2mxz2mhhm.png

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

    191017q8oc5djw2rcr882t.png

    设置完成后效果如下

    191017r2g5eo1oz183t1td.png

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

    191018kaxiq0qgg9695gj7.png

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

    191019xvz41945frtdrz1d.png

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

    191019beakqtvtr9uryuy9.png

    浏览器访问正常,阐明我们WebService摆设成功啦!

    三、通过反射动态调用WebService

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

    191020sk71d5rkpp551qir.png

    具体代码如下:

    1. using System;
    2. using System.Net;
    3. using System.IO;
    4. using System.CodeDom;
    5. using System.CodeDom.Compiler;
    6. using System.Web.Services.Description; //需导入System.Web.Services程序集(添加引用)
    7. using Microsoft.CSharp;
    8. namespace TianYa.DotNetShare.WebServiceDemo
    9. {
    10. public static class WebServiceHelper
    11. {
    12. #region 通过反射动态调用WebService
    13. #region 调用示例
    14. /************************************************************************************
    15. *
    16. * WebService方法:
    17. * [WebMethod(Description = "WebService测试方法")]
    18. * public string SayHello(string paramIn,ref string paramOut)
    19. * {
    20. * paramOut = string.Format("Hello {0}!", paramIn);
    21. * return "Success";
    22. * }
    23. *
    24. * 调用示例如下:
    25. * object[] objs = new object[] { "张三", "" }; //入参
    26. * var webServiceUrl = "http://TianYa.DotNetShare.WebServiceDemo/WebServiceTest.asmx";
    27. * object result = WebServiceHelper.InvokeWebService(webServiceUrl, "SayHello", objs); //返回结果
    28. * object paramOut = objs[1]; //出参
    29. *
    30. ************************************************************************************/
    31. #endregion
    32. /// <summary>
    33. /// 通过反射动态调用WebService
    34. /// </summary>
    35. /// <param name="webServiceUrl">WebServices地址</param>
    36. /// <param name="methodName">调用的方法名</param>
    37. /// <param name="args">把调用WebService时需要的参数按顺序放到这个object[]里,如果无参数传null</param>
    38. /// <returns>返回调用WebService的返回值,如果调用出错则返回null</returns>
    39. public static object InvokeWebService(string webServiceUrl, string methodName, params object[] args)
    40. {
    41. //这里的namespace是需要引用的WebService的定名空间,不用改也可以正常使用。也可以加一个参数从外面传进来。
    42. string @namespace = "client";
    43. try
    44. {
    45. //判断webServiceUrl中末尾是否包含“?WSDL”,如果不包含则添加
    46. if (webServiceUrl != null && !webServiceUrl.Equals(""))
    47. {
    48. if (webServiceUrl.LastIndexOf("?") > -1)
    49. {
    50. if (webServiceUrl.ToUpper().LastIndexOf("WSDL") <= -1)
    51. {
    52. webServiceUrl = webServiceUrl + "WSDL";
    53. }
    54. }
    55. else
    56. {
    57. webServiceUrl = webServiceUrl + "?WSDL";
    58. }
    59. }
    60. //获取WSDL
    61. WebClient wc = new WebClient();
    62. Stream stream = wc.OpenRead(webServiceUrl);
    63. ServiceDescription sd = ServiceDescription.Read(stream);
    64. string className = sd.Services[0].Name;
    65. ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
    66. sdi.AddServiceDescription(sd, "", "");
    67. CodeNamespace cn = new CodeNamespace(@namespace);
    68. //生成客户端代理类代码
    69. CodeCompileUnit ccu = new CodeCompileUnit();
    70. ccu.Namespaces.Add(cn);
    71. sdi.Import(cn, ccu);
    72. CSharpCodeProvider csc = new CSharpCodeProvider();
    73. //ICodeCompiler icc = csc.CreateCompiler();
    74. //设定编译参数
    75. CompilerParameters cpList = new CompilerParameters();
    76. cpList.GenerateExecutable = false;//动态编译后的程序集不生成可执行文件
    77. cpList.GenerateInMemory = true;//动态编译后的程序集只存在于内存中,不在硬盘的文件上
    78. cpList.ReferencedAssemblies.Add("System.dll");
    79. cpList.ReferencedAssemblies.Add("System.XML.dll");
    80. cpList.ReferencedAssemblies.Add("System.Web.Services.dll");
    81. cpList.ReferencedAssemblies.Add("System.Data.dll");
    82. //编译代理类
    83. CompilerResults cr = csc.CompileAssemblyFromDom(cpList, ccu);
    84. if (true == cr.Errors.HasErrors)
    85. {
    86. System.Text.StringBuilder sb = new System.Text.StringBuilder();
    87. foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
    88. {
    89. sb.Append(ce.ToString());
    90. sb.Append(System.Environment.NewLine);
    91. }
    92. //错误日志处理
    93. throw new Exception(sb.ToString());
    94. }
    95. //生成代理实例,并调用方法
    96. System.Reflection.Assembly assembly = cr.CompiledAssembly;
    97. Type t = assembly.GetType(@namespace + "." + className, true, true);
    98. object obj = Activator.CreateInstance(t);
    99. System.Reflection.MethodInfo mi = t.GetMethod(methodName);
    100. //注:method.Invoke(obj, null)返回的是一个Object,
    101. //如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(obj, null)转一下就行了,
    102. //method.Invoke(obj,null)这里的null可以传调用方法需要的参数,string[]形式的
    103. return mi.Invoke(obj, args);
    104. }
    105. catch (Exception ex)
    106. {
    107. //异常日志处理
    108. return null;
    109. }
    110. }
    111. #endregion
    112. }
    113. }
    复制代码

    在Index页面调用

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.UI;
    6. using System.Web.UI.WebControls;
    7. namespace TianYa.DotNetShare.WebServiceDemo
    8. {
    9. public partial class Index : System.Web.UI.Page
    10. {
    11. protected void Page_Load(object sender, EventArgs e)
    12. {
    13. //调用示例如下:
    14. object[] objs = new object[] { "张三", "" }; //入参
    15. var webServiceUrl = "http://TianYa.DotNetShare.WebServiceDemo/WebServiceTest.asmx";
    16. object result = WebServiceHelper.InvokeWebService(webServiceUrl, "SayHello", objs); //返回结果
    17. object paramOut = objs[1]; //出参
    18. Response.Write($"调用结果result:{result}<br/>出参结果paramOut:{paramOut}");
    19. }
    20. }
    21. }
    复制代码

    页面输出结果:

    191021c144yqiuc4n5t1n8.png

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

    WebService的Demo源码:

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

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

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


    来源:https://www.cnblogs.com/xyh9039/p/11295528.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则