C# 调用WebService的方式汇总

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

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

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

1.获取webservice地址;

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

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

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

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

3.用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地址,动态在项目中生成代理类文件,通过反射调用即可

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

/// <summary>
        /// 根据webservice地址生成代理类
        /// </summary>
        /// <param name="url">本地配置文件中webservice地址</param>
        /// <returns></returns>
        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;
        }

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

/// <summary>
     /// 调用代理类函数
     /// </summary>
     /// <param name="methodname">函数名称</param>
     /// <param name="args">入参</param>
     /// <returns></returns>
     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));
            }
        }

     /// <summary>
        /// 函数调用
        /// </summary>
        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;

        /// <summary>
        /// 单例模式
        /// </summary>
        public static HttpHelper Helper
        {
            get { return m_Helper ?? (m_Helper = new HttpHelper()); }
        }

        /// <summary>
        /// 获取请求的数据
        /// </summary>
        /// <param name="strUrl">请求地址</param>
        /// <param name="requestMode">请求方式</param>
        /// <param name="parameters">参数</param>
        /// <param name="requestCoding">请求编码</param>
        /// <param name="responseCoding">响应编码</param>
        /// <param name="timeout">请求超时时间(毫秒)</param>
        /// <returns>请求成功响应信息,失败返回null</returns>
        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;
        }


        /// <summary>
        /// get 请求指定地址返回响应数据
        /// </summary>
        /// <param name="webRequest">请求</param>
        /// <param name="timeout">请求超时时间(毫秒)</param>
        /// <returns>返回:响应信息</returns>
        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.Method = "GET";

                // 接收返回信息
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                return webResponse;
            }
            catch (Exception ex)
            {
                return null;
            }
        }


        /// <summary>
        /// post 请求指定地址返回响应数据
        /// </summary>
        /// <param name="webRequest">请求</param>
        /// <param name="parameters">传入参数</param>
        /// <param name="timeout">请求超时时间(毫秒)</param>
        /// <param name="requestCoding">请求编码</param>
        /// <returns>返回:响应信息</returns>
        private HttpWebResponse PostRequest(HttpWebRequest webRequest, Dictionary<string, string> parameters, int timeout, Encoding requestCoding)
        {
            try
            {
                // 拼接参数
                string postStr = string.Empty;
                if (parameters != null)
                {
                    parameters.All(o =>
                    {
                        if (string.IsNullOrEmpty(postStr))
                            postStr = string.Format("{0}={1}", HttpUtility.UrlEncode(o.Key), HttpUtility.UrlEncode(o.Value));
                        else
                            postStr += string.Format("&{0}={1}", HttpUtility.UrlEncode(o.Key), HttpUtility.UrlEncode(o.Value));

                        return true;
                    });
                }

                byte[] byteArray = requestCoding.GetBytes(postStr);
                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;
            }
        }


        /// <summary>
        /// 验证URL
        /// </summary>
        /// <param name="url">待验证 URL</param>
        /// <returns></returns>
        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
    }

调用方式

/// <summary>
        /// 测试调用
        /// </summary>
        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接口,均可采用此种方式;

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

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#调用WebService有三种方式:直接引用、引用wsdl和soap请求。如果开发者可以直接访问到webservice,可以使用直接引用的方式。在Visual Studio中,可以通过添加服务引用来直接引用webservice,系统会自动生成引用代码。然后可以实例化引用的webservice对象来使用。\[2\] 如果无法直接访问webservice,可以使用引用wsdl文件的方式。首先需要获取webservice的wsdl文件,可以通过浏览器打开webservice服务,然后查看服务说明,这就是整个wsdl的内容。将wsdl文件保存为文本文件,然后将后缀名改为wsdl。在Visual Studio中,同样可以通过添加服务引用来引用wsdl文件,将wsdl文件的路径输入到URL中即可。然后可以实例化引用的webservice对象来使用。\[3\] 最后一种方式是使用SOAP请求来调用webservice。这种方式适用于无法直接引用webservice或wsdl文件的情况。可以使用HttpPost请求来发送SOAP请求,并解析返回的SOAP响应。这种方式需要手动构建SOAP请求和解析SOAP响应,相对复杂一些。 总结起来,C#调用webservice可以通过直接引用、引用wsdl和soap请求三种方式来实现。具体选择哪种方式取决于开发者的需求和情况。 #### 引用[.reference_title] - *1* [【C#调用 webservice 的三种方法总结](https://blog.csdn.net/weixin_44231544/article/details/124922474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C#调用WebService的三种方式](https://blog.csdn.net/m0_43398336/article/details/105082177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值