文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C# 调用WebService的方式汇总

2023-09-07 20:00

关注

C# 调用WebService的方式汇总

方式一:根据提供的webservice地址,用VS自带工具生成cs文件,添加到项目中使用即可。

工具:
在这里插入图片描述
在这里插入图片描述

步骤一:如果本地访问不了webservice地址,则通过远端生成wsdl文件,拷贝到本地用工具生成cs类文件,导入项目中。

获取webservice地址;

在浏览器中访问webservice地址,此处访问需要在地址后面加上 ?wsdl

例如:原地址:http://42.123.92.137:1010/interface/Hospital_Interface.asmx

访问时:http://42.123.92.137:1010/interface/Hospital_Interface.asmx?wsdl

将网页中的数据另存为 (xxx.wsdl)文件,

用VS自带工具将上一步生成的(xxx.wsdl)文件通过命令生成 (xxx.cs) 类文件。

(1)直接通过wsdl文件位置生成。公式:wsdl + wsdl文件路径 + /out:+ cs生成文件路径

例:wsdl E:\service.wsdl /out:E:/WebServicetest.cs

(2)生成带有命名空间的cs文件。公式:wsdl + wsdl文件路径 + /n:命名空间名称 +/out:+ cs生成文件路径

例:wsdl E:\service.wsdl /n:test /out:E:/WebServicetest.cs

步骤二:如果本地可以直接访问到webservice地址,直接通过VS工具生成

生成公式:wsdl /n:+命名空间名称+ /out:+cs类文件路径+文件名称.cs+ webservice地址+?wsdl (注意公式里面空格的地方)

例:wsdl /n:xx /out:D:/web.cs http://192.168.0.222/WebSite/Service.asmx?wsdl

方式二:根据webservice地址,动态在项目中生成代理类文件,通过反射调用即可

将webservice地址存放到配置文件中,代码中通过读取地址生成代理类。

///         /// 根据webservice地址生成代理类        ///         /// 本地配置文件中webservice地址        ///         public static int InitCreatClass(string url)        {            try            {                //使用 XmlTextReader 对象创建和格式化 WSDL 文档                XmlTextReader reader = new XmlTextReader(url + "?wsdl");                ServiceDescription serviceDes = ServiceDescription.Read(reader);                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();                sdi.AddServiceDescription(serviceDes, "", "");                CodeNamespace cnspace = new CodeNamespace(@namespace);                //生成客户端代理类                CodeCompileUnit ccUnit = new CodeCompileUnit();                ccUnit.Namespaces.Add(cnspace);                sdi.Import(cnspace, ccUnit);                CSharpCodeProvider cscProvider = new CSharpCodeProvider();                ICodeCompiler icc = cscProvider.CreateCompiler();                //设置编译参数                CompilerParameters copParameters = new CompilerParameters();                copParameters.GenerateExecutable = false;                copParameters.GenerateInMemory = true;                copParameters.OutputAssembly = "TestWebService.dll";                copParameters.ReferencedAssemblies.Add("System.dll");                copParameters.ReferencedAssemblies.Add("System.XML.dll");                copParameters.ReferencedAssemblies.Add("System.Web.Services.dll");                copParameters.ReferencedAssemblies.Add("System.Data.dll");                //编译代理类                CompilerResults comResults = icc.CompileAssemblyFromDom(copParameters, ccUnit);                if (true == comResults.Errors.HasErrors)                {                    System.Text.StringBuilder sb = new System.Text.StringBuilder();                    foreach (System.CodeDom.Compiler.CompilerError ce in comResults.Errors)                    {                        sb.Append(ce.ToString());                        sb.Append(System.Environment.NewLine);                    }                    throw new Exception(sb.ToString());                }            }            catch (Exception ex)            {                throw new Exception(ex.Message);            }            return 0;        }

访问代理类,调用类中的函数

///      /// 调用代理类函数     ///      /// 函数名称     /// 入参     ///      public static object InvokeWebService(string methodname, object[] args)        {            try            {                //通过反射调用代理类函数                System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("TestWebService.dll");                Type t = asm.GetType(classname);                object o = Activator.CreateInstance(t);                System.Reflection.MethodInfo method = t.GetMethod(methodname);                return method.Invoke(o, args);            }            catch (Exception ex)            {                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));            }        }     ///         /// 函数调用        ///         private void TestInvoke()        {            string[] ReqParms = new string[4];//参数数量            ReqParms[0] = "参数1";            ReqParms[1] = "参数2";            ReqParms[2] = "参数3";            ReqParms[3] = "参数4";            //Func_Name  被调用函数名称            string result = InvokeWebServiceD("Func_Name", ReqParms).ToString();        }

方式三:通过 HttpWebRequest 直接调用webservice中的函数

构建httprequest帮助类

public partial class HttpHelper    {        private static HttpHelper m_Helper;        ///         /// 单例模式        ///         public static HttpHelper Helper        {            get { return m_Helper ?? (m_Helper = new HttpHelper()); }        }        ///         /// 获取请求的数据        ///         /// 请求地址        /// 请求方式        /// 参数        /// 请求编码        /// 响应编码        /// 请求超时时间(毫秒)        /// 请求成功响应信息,失败返回null        public string GetResponseString(string strUrl, ERequestMode requestMode, Dictionary<string, string> parameters, Encoding requestCoding, Encoding responseCoding, int timeout = 300)        {            string url = VerifyUrl(strUrl);            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url));            HttpWebResponse webResponse = null;            switch (requestMode)            {                case ERequestMode.Get:                    webResponse = GetRequest(webRequest, timeout);                    break;                case ERequestMode.Post:                    webResponse = PostRequest(webRequest, parameters, timeout, requestCoding);                    break;            }            if (webResponse != null && webResponse.StatusCode == HttpStatusCode.OK)            {                using (Stream newStream = webResponse.GetResponseStream())                {                    if (newStream != null)                        using (StreamReader reader = new StreamReader(newStream, responseCoding))                        {string result = reader.ReadToEnd();return result;                        }                }            }            return null;        }        ///         /// get 请求指定地址返回响应数据        ///         /// 请求        /// 请求超时时间(毫秒)        /// 返回:响应信息        private HttpWebResponse GetRequest(HttpWebRequest webRequest, int timeout)        {            try            {                webRequest.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, **; q=0.01";                webRequest.Headers.Add("Accept-Language", "zh-cn,en-US,en;q=0.5");                webRequest.Headers.Add("Cache-Control", "no-cache");                webRequest.UserAgent = "DefaultUserAgent";                //webRequest.Timeout = timeout;                webRequest.ContentType = "application/x-www-form-urlencoded";                webRequest.ContentLength = byteArray.Length;                webRequest.Method = "POST";                // 将参数写入流                using (Stream newStream = webRequest.GetRequestStream())                {                    newStream.Write(byteArray, 0, byteArray.Length);                    newStream.Close();                }                // 接收返回信息                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();                return webResponse;            }            catch (Exception ex)            {                return null;            }        }        ///         /// 验证URL        ///         /// 待验证 URL        ///         private string VerifyUrl(string url)        {            if (string.IsNullOrEmpty(url))                throw new Exception("URL 地址不可以为空!");            if (url.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase))                return url;            return string.Format("http://{0}", url);        }    }    public enum ERequestMode    {        Get,        Post    }

调用方式

///         /// 测试调用        ///         private void TestInvoke()        {            //组织参数            Dictionary<string, string> parameters = new Dictionary<string, string>();            parameters.Add("CantonCode", PersonInfo.RegionNumber);            parameters.Add("CardCode", PersonInfo.CardNo);            parameters.Add("Name", txtName.Text);            parameters.Add("CompHosCode", SystemConfigData.HospitalCode);            string _result = HttpHelper.Helper.GetResponseString(url, ERequestMode.Post, parameters, Encoding.Default, Encoding.UTF8);        }

以下是对上面三种方式进行总结。

方式一、

优点:利用地址直接生成cs类,操作方便快捷,发生错误机率小,调用简单;

缺点:如果webservice地址或者内容发生改变,项目必须重新生成cs文件,导致项目维护性差;

采用场景:webservice接口已经趋于稳定,不会有变动的情况下可使用这种方式;

方式二、

优点:将webservice地址放在配置文件中,一旦地址放生变化,只需要修改配置文件即可,项目维护性好;

缺点:对webservice接口要求比较高,不规范的webservice接口,生成代理类时会发生错误;

采用场景:webservice接口规范,且变动小时,可采用此种方式;

方式三、

优点:添加帮助类,然后调用即可,方便快捷,webservice地址放置在配置文件中,易于维护;

缺点:暂时未发现较大缺点;

采用场景:任何webservice接口,均可采用此种方式;

使用推荐:方式三 > 方式一 > 方式二

来源地址:https://blog.csdn.net/weixin_44012111/article/details/126406375

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯