C# webservice的创建以及调用(生成本地dll并调用)

coderooter 2022-05-16 16:40:50

1.webservice的创建与发布

1.webservice的创建

使用工具 win10,vs2019

打开vs2019->创建新项目

选择创建要用到的那些东西 你们懂的

 

 

 创建就ok了

然后右键项目名 

 新建项

 如下

 我自己加了两个简单的方法(加分)等下验证使用(我标记的这个也要加 不然这个方法看不到)

 

 这样就写好了 然后

 打开如下这样就好啦!

2.asmx的发布

右键项目名->发布(B)

 然后我们选择文件夹

 然后点击下去完成就好了

 点击这个发布就可以了

 然后我们进入我们文件所在的目录

生成的就在这个目录的这个路径下

 

 这样创建以及发布就搞好啦

记住这个路径 后面要在IIS里面使用到哦

 

2.IIS服务的启用以及注册webservice

这时候要验证一般是直接打开iis进行注册 但是我们可能有这个功能但是没有启用

先去控制面板看一下

查看功能的启用

 

 把这几个功能开起来

 

 

 

 

勾选完成  确认 等待更新完成 

然后就可以运行 IIS 了

Win+R组合键打开运行,输入 Inetmgr 命令

 网站->添加网站 

这个路径就是前面我们发布的那个路径

 

 然后依照这个步骤设置好

 然后去网站里面

按照如下顺序

 浏览如下图所示就ok了 恭喜!

 如果浏览报错 404 那估计是服务开启那里有问题 麻烦再去看下控制面板那里的程序是不是 有我标志的没有启用

3.生成dll并调用方法

代码如下

我创建了一个类WebserviceDeal来处理(类有点大)

/***********************************************************************************************/

public class WebserviceDeal
    {
        static bool isCreate = false;
        public static readonly object obj = new object();

        /// <summary> 输出的dll文件名称 </summary>
        private static string m_OutputDllFilename;

        /// <summary> WebService代理类名称 </summary>
        private static string m_ProxyClassName;

        /// <summary> WebService代理类实例 </summary>
        private static object m_ObjInvoke;

        /// <summary> 接口方法字典 </summary>
        private static Dictionary<EMethod, MethodInfo> m_MethodDic = new Dictionary<EMethod, MethodInfo>();

        /// <summary> 创建WebService,生成客户端代理程序集文件 </summary>
        /// <param webServiceUrl="error">错误信息</param>
        /// <returns>返回:true或false</returns>
        public static bool CreateWebService(string webServiceUrl)
        {
            lock (obj)
            {
                System.Threading.Thread.Sleep(10);
                if (isCreate)
                    return true;
                isCreate = true;
                try
                {
                    if (!Directory.Exists(".\\DLL"))
                    {
                        Directory.CreateDirectory(".\\DLL");
                    }

                    if (m_ProxyClassName == null || m_ProxyClassName == "")
                    {
                        m_ProxyClassName = GetClassName(webServiceUrl);
                    }

                    // error = string.Empty;
                    m_OutputDllFilename = ".\\DLL\\demo.dll";


                    //m_ProxyClassName = Proxy.BasalWebService.ToString();
                    webServiceUrl += "?WSDL";

                    if (File.Exists(m_OutputDllFilename))
                    {
                        File.Delete(m_OutputDllFilename);
                    }   //重新生成dll,防止Web路径发生变化


                    //使用 WebClient 下载 WSDL 信息。
                    WebClient web = new WebClient();
                    Stream stream = web.OpenRead(webServiceUrl);

                    if (stream == null)
                    {
                        //Log.AddMsg(LogLevel.Info, "读取Webserver上的数据为空");
                    }
                    else
                    {
                        //Log.AddMsg(LogLevel.Info, "已下载 WSDL 信息");
                    }
                    //创建和格式化 WSDL 文档。
                    if (stream != null)
                    {
                        // 格式化WSDL
                        ServiceDescription description = ServiceDescription.Read(stream);

                        // 创建客户端代理类。
                        ServiceDescriptionImporter importer = new ServiceDescriptionImporter
                        {
                            ProtocolName = "Soap",
                            Style = ServiceDescriptionImportStyle.Client,
                            CodeGenerationOptions =
                                CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync
                        };

                        // 添加 WSDL 文档。
                        importer.AddServiceDescription(description, null, null);

                        //使用 CodeDom 编译客户端代理类。
                        CodeNamespace nmspace = new CodeNamespace();
                        CodeCompileUnit unit = new CodeCompileUnit();
                        unit.Namespaces.Add(nmspace);

                        ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

                        CompilerParameters parameter = new CompilerParameters
                        {
                            GenerateExecutable = false,
                            // 指定输出dll文件名。
                            OutputAssembly = m_OutputDllFilename
                        };

                        parameter.ReferencedAssemblies.Add("System.dll");
                        parameter.ReferencedAssemblies.Add("System.XML.dll");
                        parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                        parameter.ReferencedAssemblies.Add("System.Data.dll");

                        // 编译输出程序集
                        CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);


                        if (!result.Errors.HasErrors)
                        {
                            BuildMethods();
                            return true;
                        }
                        else
                        {

                            //Log.AddMsg(LogLevel.Error, "反射生成dll文件时异常");
                            //Log.ShowDialog(LogLevel.Error, "反射生成dll文件时异常,请检查配置文件Web路径是否正确或网络是否正常", "ERROR");
                            //error = "反射生成dll文件时异常";
                        }
                        stream.Close();
                        stream.Dispose();
                    }
                    else
                    {
                        //error = "打开WebServiceUrl失败";
                        //Log.ShowDialog(LogLevel.Error, "打开WebServiceUrl失败,请检查配置文件Web路径是否正确或网络是否正常", "ERROR");
                    }
                }
                catch (Exception ex)
                {
                    //Log.AddMsg(LogLevel.Error, ex.Message);
                    //Log.ShowDialog(LogLevel.Error, "反射生成dll文件时异常\r\n" + ex.Message, "ERROR");
                    //error = ex.Message;
                }
            }
            return false;
        }

 /// <summary> 反射构建Methods </summary>
        private static void BuildMethods()
        {
            //Log.AddMsg(LogLevel.Info, $"输出dll文件名:{m_OutputDllFilename},代理类名称:{m_ProxyClassName}");
            Assembly asm = Assembly.LoadFrom(m_OutputDllFilename);
            //var types = asm.GetTypes();

            //输入创建webservice的类的名称
            Type asmType = asm.GetType(m_ProxyClassName);

            m_ObjInvoke = Activator.CreateInstance(asmType);
            if (m_ObjInvoke != null)
            {
                //Log.AddMsg(LogLevel.Info, "创建代理类实例成功");
            }
            //var methods = asmType.GetMethods();
            var methods = Enum.GetNames(typeof(EMethod)).ToList();
            foreach (var item in methods)
            {
                var methodInfo = asmType.GetMethod(item);
                if (methodInfo != null)
                {
                    var method = (EMethod)Enum.Parse(typeof(EMethod), item);
                    //Log.AddMsg(LogLevel.Info, $"方法名:{method},方法:{methodInfo}");
                    m_MethodDic.Add(method, methodInfo);
                }
            }
        }

/// <summary> 获取请求响应 </summary>
        /// <param name="method">方法</param>
        /// <param name="para">参数</param>
        /// <returns>返回:XML串</returns>
        public static string GetResponseString(EMethod method, params object[] para)
        {
            string result = null;
            object temp;
            try
            {

                if (m_MethodDic.ContainsKey(method))
                {
                    //Log.AddMsg(LogLevel.Info, $"调用方法名:{method}");
                    //Log.AddMsg(LogLevel.Info, $"客户端代理类实例:{m_ObjInvoke}");
                    //Log.AddMsg(LogLevel.Info, $"调用方法:{m_MethodDic[method]}");
                    //Log.AddMsg(LogLevel.Info, $"参数:{para}");

                    temp = m_MethodDic[method].Invoke(m_ObjInvoke, para);


                    if (temp != null)
                    {
                        result = temp.ToString();
                    }
                    else
                    {
                        //Log.AddMsg(LogLevel.Info, "读取失败");
                    }
                }
                else
                {
                    //Log.AddMsg(LogLevel.Error, "不存在方法名称" + method.ToString());
                }

                return result;
            }
            catch (Exception e)
            {
                //Log.AddMsg(LogLevel.Error, $"异常:{e.Message}");
                return result;
            }

        }

        //枚举出接口名
        public enum EMethod
        {
            HelloWorld,

            Add
        }

        /// <summary>
        /// WebService代理类名称
        /// </summary>
        public enum Proxy
        {
            BasalWebService,

        }

        public static string GetClassName(string url)

        {

            string[] parts = url.Split('/');

            string[] pps = parts[parts.Length - 1].Split('.');

            return pps[0];

        }
    }
}

/***********************************************************************************************/

其中using这些

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Web.Services.Description;
using System.Xml.Serialization;

声明了这个类了 我们就可以在我们的主函数调用这个接口来使用了

我这边会直接生成一个demo.dll然后调用这个dll里面的接口来实现访问webservice

我实验是在命令行使用的调用方法如下

            WebserviceDeal.CreateWebService(@"http://localhost:8990/WebService1.asmx");

            object[] para = new object[2];
            para[0] = 1;
            para[1] = 2;

            Console.WriteLine(WebserviceDeal.GetResponseString(WebserviceDeal.EMethod.HelloWorld));
            Console.WriteLine($"the result:{WebserviceDeal.GetResponseString(WebserviceDeal.EMethod.Add, para)}");
            Console.ReadKey();

这里创建的参数就是我们要访问的url

运行结果如下:

 至此 完成啦!!

...全文
1738 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
这玩意谁会呀 2024-03-01
  • 打赏
  • 举报
回复

牛的

11,331

社区成员

发帖
与我相关
我的任务
社区描述
CSDN全站用户和CSDN产品经理、运营人员集中交流讨论CSDN各产品问题的通道,欢迎大家提供建设性的建议,让CSDN变得更好。也请大家不要在这里发布招聘、技术问题等无关CSDN产品的内容,谢谢。
其他 其他
社区管理员
  • 社区公告社区
  • ZK645945
  • CSDN官方博客
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧