最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#調用WebService的實現(xiàn)方法

 更新時間:2025年06月03日 09:17:42   作者:qq_38151300  
這篇文章主要介紹了C#調用WebService的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、前言

在日常工作中,如果涉及到與第三方進行接口對接,有的會使用WebService的方式,這篇文章主要講解在.NET Framework中如何調用WebService。

1.創(chuàng)建WebService

(1)新建項目——模板選擇ASP.NET Web 應用程序

(2)選擇空項目模板

(3)右擊項目-添加-Web服務(ASMX)

(4)新建后會自動生成一個測試服務HelloWorld并返回執(zhí)行字符串

(5)點擊運行,并調用返回

二、方法一:靜態(tài)引用

這種方式是通過添加靜態(tài)引用的方式調用WebService

1.首先創(chuàng)建一個Winform程序

右擊引用-添加服務引用。地址即為 運行的WebService地址,命名空間可自命名

2.設計Winform窗體

可選擇工具箱button調用,TextBox入?yún)?/p>

3.根據(jù)所需

調用WebService服務即可拿到返回參數(shù)

三、動態(tài)調用

上面使用靜態(tài)引用的方式調用WebService,但是這種方式有一個缺點:如果發(fā)布的WebService地址改變,那么就要重新添加WebService的引用。如果是現(xiàn)有的WebService發(fā)生了改變,也要更新現(xiàn)有的服務引用,這需要把代碼放到現(xiàn)場才可以。

使用動態(tài)調用WebService的方法可以解決該問題。

1.我們在配置文件里面添加配置

把WebService的地址、WebService提供的類名、要調用的方法名稱,都寫在配置文件里面

2.同樣設計Winform界面

添加按鈕,調用WebService服務。

添加幫助類

using System;
using System.CodeDom.Compiler;
using System.CodeDom;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.Web;
using System.Xml.Serialization;
using System.Web.Caching;
using System.Web.Services.Description;

namespace ApiTest1
{
    internal class WebServiceHelper
    {
        /// <summary>
        /// 生成dll文件保存到本地
        /// </summary>
        /// <param name="url">WebService地址</param>
        /// <param name="className">類名</param>
        /// <param name="methodName">方法名</param>
        /// <param name="filePath">保存dll文件的路徑</param>
        public static void CreateWebServiceDLL(string url, string className, string methodName, string filePath)
        {
            // 1. 使用 WebClient 下載 WSDL 信息。
            WebClient web = new WebClient();
            Stream stream = web.OpenRead(url + "?WSDL");
            // 2. 創(chuàng)建和格式化 WSDL 文檔。
            ServiceDescription description = ServiceDescription.Read(stream);
            //如果不存在就創(chuàng)建file文件夾
            if (Directory.Exists(filePath) == false)
            {
                Directory.CreateDirectory(filePath);
            }

            if (File.Exists(filePath + className + "_" + methodName + ".dll"))
            {
                //判斷緩存是否過期
                var cachevalue = HttpRuntime.Cache.Get(className + "_" + methodName);
                if (cachevalue == null)
                {
                    //緩存過期刪除dll
                    File.Delete(filePath + className + "_" + methodName + ".dll");
                }
                else
                {
                    // 如果緩存沒有過期直接返回
                    return;
                }
            }

            // 3. 創(chuàng)建客戶端代理代理類。
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
            // 指定訪問協(xié)議。
            importer.ProtocolName = "Soap";
            // 生成客戶端代理。
            importer.Style = ServiceDescriptionImportStyle.Client;
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
            // 添加 WSDL 文檔。
            importer.AddServiceDescription(description, null, null);
            // 4. 使用 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();
            parameter.GenerateExecutable = false;
            // 可以指定你所需的任何文件名。
            parameter.OutputAssembly = filePath + className + "_" + methodName + ".dll";
            parameter.ReferencedAssemblies.Add("System.dll");
            parameter.ReferencedAssemblies.Add("System.XML.dll");
            parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
            parameter.ReferencedAssemblies.Add("System.Data.dll");
            // 生成dll文件,并會把WebService信息寫入到dll里面
            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
            if (result.Errors.HasErrors)
            {
                // 顯示編譯錯誤信息
                System.Text.StringBuilder sb = new StringBuilder();
                foreach (CompilerError ce in result.Errors)
                {
                    sb.Append(ce.ToString());
                    sb.Append(System.Environment.NewLine);
                }
                throw new Exception(sb.ToString());
            }
            //記錄緩存
            var objCache = HttpRuntime.Cache;
            // 緩存信息寫入dll文件
            objCache.Insert(className + "_" + methodName, "1", null, DateTime.Now.AddMinutes(5), TimeSpan.Zero, CacheItemPriority.High, null);
        }



        /// <summary>
        /// 根據(jù)WebService的url地址獲取className
        /// </summary>
        /// <param name="wsUrl">WebService的url地址</param>
        /// <returns></returns>
        //private string GetWsClassName(string wsUrl)
        //{
        //    string[] parts = wsUrl.Split('/');
        //    string[] pps = parts[parts.Length - 1].Split('.');
        //    return pps[0];
        //}
    }
}

3.動態(tài)調用WebService代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ApiTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // 讀取配置文件,獲取配置信息
            string url = ConfigurationManager.AppSettings["WebServiceAddress"];
            string className = ConfigurationManager.AppSettings["ClassName"];
            string methodName = ConfigurationManager.AppSettings["MethodName"];
            string filePath = ConfigurationManager.AppSettings["FilePath"];
            // 調用WebServiceHelper
            WebServiceHelper.CreateWebServiceDLL(url, className, methodName, filePath);
            // 讀取dll內容
            byte[] filedata = File.ReadAllBytes(filePath + className + "_" + methodName + ".dll");
            // 加載程序集信息
            Assembly asm = Assembly.Load(filedata);
            Type t = asm.GetType(className);
            // 創(chuàng)建實例
            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod(methodName);
            // 參數(shù)
            string MsgCode = textBox1.Text;
            string SendXml = textBox2.Text;
            //string UserCode = textBox3.Text;
            object[] args = { MsgCode, SendXml};
            //object[] args = { "動態(tài)調用WebService" };
            // 調用訪問,獲取方法返回值
            string value = method.Invoke(o, args).ToString();
            //輸出返回值
            MessageBox.Show($"返回值:{value}");
        }
    }
}

程序運行結果

如果說類名沒有提供,可以根據(jù)url來自動獲取類名:

見幫助類(WebServiceHelper)中GetWsClassName 方法。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • c# 爬取優(yōu)酷電影信息(1)

    c# 爬取優(yōu)酷電影信息(1)

    這篇文章主要介紹了c# 如何爬取優(yōu)酷電影信息,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-02-02
  • 微信公眾號被動消息回復原理解析

    微信公眾號被動消息回復原理解析

    這篇文章主要介紹了公眾號被動消息回復原理解析,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • 關于C#反射 你需要知道的

    關于C#反射 你需要知道的

    這篇文章主要介紹了C#反射的相關知識,文中講解的非常詳細,代碼幫助大家更好的參考學習,感興趣的朋友可以了解下
    2020-06-06
  • 使用C#實現(xiàn)在屏幕上畫圖效果的代碼實例

    使用C#實現(xiàn)在屏幕上畫圖效果的代碼實例

    本篇文章是對使用C#在屏幕上畫圖效果的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Chrome Visual Studio 2005下的編譯過程

    Chrome Visual Studio 2005下的編譯過程

    研究Chrome ,首先得把它編譯出來,這對于后續(xù)的代碼分析和閱讀有很大的幫助,想想自己編譯出一個 Chrome 瀏覽器來使用,那是一件很炫的事情。
    2009-07-07
  • Unity接入百度AI實現(xiàn)通用物體和場景識別

    Unity接入百度AI實現(xiàn)通用物體和場景識別

    這篇文章主要介紹了在Unity中接入百度AI接口,從而實現(xiàn)通用物體和場景的識別,其中接口返回大類及細分類的名稱,并支持獲取識別結果對應的百科信息。感興趣的可以學習一下
    2022-01-01
  • C#無限參數(shù)的寫法

    C#無限參數(shù)的寫法

    這篇文章主要介紹了C#無限參數(shù)的寫法,通過循環(huán)遍歷再結合paras.Add方法實現(xiàn)無限參數(shù)的功能,是比較實用的技巧,需要的朋友可以參考下
    2014-12-12
  • c# 編寫一個輕量級的異步寫日志的實用工具類(LogAsyncWriter)

    c# 編寫一個輕量級的異步寫日志的實用工具類(LogAsyncWriter)

    這篇文章主要介紹了c# 如何編寫一個輕量級的異步寫日志的實用工具類(LogAsyncWriter),幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#中[]的幾種用法示例代碼

    C#中[]的幾種用法示例代碼

    不像數(shù)學里面有方括號和花括號,在C#語法中”[]”與”{}”有專門的用途,下面這篇文章主要給大家介紹了關于C#中[]的幾種用法,需要的朋友可以參考下
    2023-01-01
  • C#迷你猜數(shù)實例分析

    C#迷你猜數(shù)實例分析

    這篇文章主要介紹了C#迷你猜數(shù),實例分析C#操作數(shù)字及數(shù)組的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03

最新評論

云和县| 宽甸| 汤原县| 双鸭山市| 卫辉市| 正宁县| 崇礼县| 牡丹江市| 余姚市| 西青区| 西华县| 即墨市| 加查县| 铜陵市| 余庆县| 微山县| 双辽市| 衡阳市| 肥乡县| 鄱阳县| 上思县| 河东区| 丰台区| 外汇| 上栗县| 连江县| 奉新县| 双柏县| 聂拉木县| SHOW| 察隅县| 广宁县| 武定县| 兴业县| 木兰县| 温宿县| 温州市| 西城区| 合山市| 南岸区| 定边县|