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

C#客戶端HttpClient請(qǐng)求認(rèn)證及數(shù)據(jù)傳輸

 更新時(shí)間:2022年01月18日 12:07:45   作者:癡者工良  
本文詳細(xì)講解了C#客戶端HttpClient請(qǐng)求認(rèn)證及數(shù)據(jù)傳輸,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一,授權(quán)認(rèn)證

客戶端請(qǐng)求服務(wù)器時(shí),需要通過授權(quán)認(rèn)證許可,方能獲取服務(wù)器資源,目前比較常見的認(rèn)證方式有 Basic 、JWT、Cookie。

HttpClient 是 C# 中的 HTTP/HTTPS 客戶端,用于發(fā)送 HTTP 請(qǐng)求和接收來自通過 URI 確認(rèn)的資源的 HTTP 響應(yīng)。下面以具體代碼做示范。

1. 基礎(chǔ)認(rèn)證示例

        // Basic基礎(chǔ)認(rèn)證
        public async Task Basic(string user, string password, string url)
        {
            // 如果認(rèn)證頁面是 https 的,請(qǐng)參考一下 jwt 認(rèn)證的 HttpClientHandler
            // 創(chuàng)建  client 
            HttpClient client = new HttpClient();

            // 創(chuàng)建身份認(rèn)證
            // using System.Net.Http.Headers;
            AuthenticationHeaderValue authentication = new AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.UTF8.GetBytes($"{user}:{password}")
                ));


            client.DefaultRequestHeaders.Authorization = authentication;

            byte[] response = await client.GetByteArrayAsync(url);
            client.Dispose();
        }

可以看到 Basic 認(rèn)證的安全程度非常低,多用于路由器和嵌入式設(shè)備,而且往往不會(huì)使用 HTTPS。

2. JWT 認(rèn)證示例

        // Jwt認(rèn)證
        public async Task Bearer(string token, string url)
        {
            // HttpClientHandler及其派生類使開發(fā)人員能夠配置各種選項(xiàng), 包括從代理到身份驗(yàn)證。
            // helpLink https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler?view=netframework-4.8
            var httpclientHandler = new HttpClientHandler();

            // 如果服務(wù)器有 https 證書,但是證書不安全,則需要使用下面語句
            // => 也就是說,不校驗(yàn)證書,直接允許
            httpclientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true;

            using (var httpClient = new HttpClient(httpclientHandler))
            {
                // 創(chuàng)建身份認(rèn)證
                // System.Net.Http.Headers.AuthenticationHeaderValue;
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
                await httpClient.GetAsync(url);
                httpClient.Dispose();
            }
        }

JWT 認(rèn)證,需要客戶端攜帶 token ,token 是一段加密過的字符串,關(guān)于原理這里不多說,token 是通過客戶端 header 攜帶的。

另外,對(duì)于測試的 Web 應(yīng)用或者內(nèi)網(wǎng)應(yīng)用, HTTPS 證書可能不是公網(wǎng)國際認(rèn)證的證書,就需要跳過認(rèn)證,直接允許訪問使用。

            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
            };

3. Cookie 示例

HttpClient 中,Cookie 有兩種處理方式。

一種是已經(jīng)知道 Cookie ,直接將 Cookie 存儲(chǔ)到 HttpClient 中;另一種是還沒有 Cookie ,通過賬號(hào)密碼登錄獲取到 Cookie ,自動(dòng)存儲(chǔ)到 HttpClient 對(duì)象中,接著使用當(dāng)前 HttpClient 對(duì)象請(qǐng)求 URL。

兩種方式的設(shè)定,是通過 HttpClientHandler 的 UseCookies 屬性設(shè)置的。

示例

            var httpclientHandler = new HttpClientHandler()
            {
                UseCookies = true
            };

? UseCookies 獲取或設(shè)置一個(gè)值,該值指示處理程序是否使用 CookieContainer 屬性存儲(chǔ)服務(wù)器 Cookie,并在發(fā)送請(qǐng)求時(shí)使用這些 Cookie。

方式1:

        // 先用賬號(hào)密碼登陸再請(qǐng)求
        public async Task Cookie(string user, string password, string loginUrl, string url)
        {
            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
                UseCookies = true
            };
            // 如果服務(wù)器有 https 證書,但是證書不安全,則需要使用下面語句
            // => 也就是說,不校驗(yàn)證書,直接允許

            var loginContent = new FormUrlEncodedContent(new[]
            {
             new KeyValuePair<string,string>("user",user),
             new KeyValuePair<string, string>("password",password)
            });
            using (var httpClient = new HttpClient(httpclientHandler))
            {
                // 先登陸
                var result = await httpClient.PostAsync(loginUrl, loginContent);
                // 登陸成功后,客戶端會(huì)自動(dòng)攜帶 cookie ,不需要再手動(dòng)添加
                //if (result.IsSuccessStatusCode)
                //{
                //    /*
                //     * 如果請(qǐng)求成功
                //     */
                //}

                var result2 = await httpClient.GetAsync(url);
                // httpclient 已經(jīng)攜帶 Cookie ,可以多次使用
                // var result3 = await httpClient.GetAsync(url3);
                // var result4 = await httpClient.GetAsync(url4);
                httpClient.Dispose();
            }
        }

方式2:

        //已經(jīng)拿到 cookie ,直接使用 cookie 請(qǐng)求
        public async Task Cookie(string cookie, string url)
        {
            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
                UseCookies = false
            };
            // 如果服務(wù)器有 https 證書,但是證書不安全,則需要使用下面語句
            // => 也就是說,不校驗(yàn)證書,直接允許


            using (var httpClient = new HttpClient(httpclientHandler))
            {
                httpClient.DefaultRequestHeaders.Add("Cookie", cookie);
                await httpClient.GetAsync(url);
                httpClient.Dispose();
            }
        }

二,請(qǐng)求類型

HTTP 請(qǐng)求里,有 GET、POST、DELETE、PUT 等請(qǐng)求方式。

HttpClient 中,有以下請(qǐng)求相關(guān)的方法

  • CancelPendingRequests
  • DeleteAsync
  • GetAsync
  • GetByteArrayAsync
  • GetStreamAsync
  • GetStringAsync
  • PostAsync
  • PutAsync
  • SendAsync

其中, CancelPendingRequests 是取消該實(shí)例所有掛起的請(qǐng)求,不是請(qǐng)求類型。

SendAsync 用于處理送 HttpRequestMessage(表示一條 HTTP 請(qǐng)求消息),比較原生。

對(duì)于 GetAsync、PostAsync等請(qǐng)求方法,使用過程類似,下面是使用示例

        public async void Request(string url)
        {

            using (var httpClient = new HttpClient())
            {
                // HttpClient 中,所有 Get 請(qǐng)求都是異步的
                HttpResponseMessage result = await httpClient.GetAsync(url);

                // Task<>.Result 可以獲取異步結(jié)果
                result = httpClient.GetAsync(url).Result;

                //var result1 = await httpClient.GetByteArrayAsync(url);
                //var result1 = await httpClient.GetStreamAsync(url);
                //var result1 = await httpClient.GetStringAsync(url);

                // ByteArrayContent

                FormUrlEncodedContent fromContent = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string,string>("Email","123@qq.com"),
                    new KeyValuePair<string, string>("Number","666")
                });
                // 使用 Post ,必須攜帶 繼承 HttpContent 的對(duì)象
                // 就是說,Post 必須要上傳數(shù)據(jù)
                result = await httpClient.PostAsync(url, fromContent);

                // 如果沒有數(shù)據(jù)要上傳,可以使用 null
                result = await httpClient.PostAsync(url, null);


                httpClient.Dispose();
            }

三,數(shù)據(jù)傳輸

HTTP/HTTPS 請(qǐng)求中,往往隨著數(shù)據(jù)傳輸,例如表單提交、JSON上傳、文件上傳等,下面以代碼示范。

1. Query

ASP.NET Core API 可以這樣寫

        [HttpPost("aaa")]
        public async Task<JsonResult> AAA(int? a, int? b)
        {
            if (a == null || b == null)
                return new JsonResult(new { code = 0, result = "aaaaaaaa" });
            return new JsonResult(new { code = 2000, result = a + "|" + b });
        }

HttpClient

        // URL Query 參數(shù)
        public void Query(string a, string b)
        {
            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
            };
            using (var httpClient = new HttpClient(httpclientHandler))
            {

                var result = httpClient.PostAsync($"https://localhost:5001/test?a={a}&b=", null).Result;

                httpClient.Dispose();
            }
        }

2. Header

Header 是以鍵值形式存儲(chǔ)的,HttpClient 示例

        // Header 頭
        public void Header()
        {
            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
            };
            using (var httpClient = new HttpClient(httpclientHandler))
            {
                httpClient.DefaultRequestHeaders.Add("MyEmail", "123@qq.com");
                var result = httpClient.GetAsync($"https://localhost:5001/test").Result;

                httpClient.Dispose();
            }
        }

ASP.NET Core API 示例

        [HttpPost("ddd")]
        public async Task<JsonResult> DDD([FromHeader]int? a, [FromHeader]int? b)
        {
            if (a == null || b == null)
                return new JsonResult(new { code = 0, result = "aaaaaaaa" });
            return new JsonResult(new { code = 200, result = a + "|" + b });
        }

3. 表單

        //  表單提交
        // application/x-www-form-urlencoded
        public void From()
        {
            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
            };

            var fromContent = new FormUrlEncodedContent(new[]
            {
             new KeyValuePair<string,string>("Id","1"),
             new KeyValuePair<string,string>("Name","癡者工良"),
             new KeyValuePair<string, string>("Number","666666")
            });

            using (var httpClient = new HttpClient(httpclientHandler))
            {
                var result = httpClient.PostAsync("https://localhost:5001/test", fromContent).Result;

                Console.WriteLine(result.Content.ReadAsStringAsync().Result);
                httpClient.Dispose();
            }
        }

4. JSON

除了 JSON ,還有

  • text/html
  • application/javascript
  • text/plain
  • application/xml

他們都是使用 StringContent 來表示。

        // Json 等
        public void StringAnd(string json)
        {
            var httpclientHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
            };


            var jsonContent = new StringContent(json);

            // Json 是 StringContent,上傳時(shí)要指定 Content-Type 屬性,除此外還有
            // text/html
            // application/javascript
            // text/plain
            // application/xml
            jsonContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");

            using (var httpClient = new HttpClient(httpclientHandler))
            {

                var result = httpClient.PostAsync("https://localhost:5001/test", jsonContent).Result;

                Console.WriteLine(result.Content.ReadAsStringAsync().Result);
                httpClient.Dispose();
            }
        }

5. 上傳文件

API 這樣寫

      [HttpPost]    //上傳文件是 post 方式,這里加不加都可以
        public async Task<IActionResult> UploadFiles(List<IFormFile> files)
        {
        // ...
        }

HttpClient 寫法

        // 上傳文件
        public async Task File(string filepath, string fromName, string url)
        {
            using (var client = new HttpClient())
            {
                FileStream imagestream = System.IO.File.OpenRead(filepath);
                // multipartFormDataContent.Add();
                var multipartFormDataContent = new MultipartFormDataContent()
                {
                    {
                        new ByteArrayContent(System.IO.File.ReadAllBytes(filepath)),    // 文件流
                        fromName,                                                       // 對(duì)應(yīng) 服務(wù)器 WebAPI 的傳入?yún)?shù)
                        Path.GetFileName(filepath)                                      // 上傳的文件名稱
                    }
                };
                /* 
                 * 如果服務(wù)器 API 寫法是
                 * ([FromForm]IFromFile files)
                 * 那么上面的 fromName="files"
                 */
                // multipartFormDataContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

                HttpResponseMessage response = await client.PostAsync(url, multipartFormDataContent);
                if (!response.IsSuccessStatusCode)
                {

                    Console.WriteLine("up image error");
                    Console.WriteLine(response.RequestMessage);
                }
            }
        }

 以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#使用偽隨機(jī)數(shù)實(shí)現(xiàn)加密用戶密碼的方法

    C#使用偽隨機(jī)數(shù)實(shí)現(xiàn)加密用戶密碼的方法

    這篇文章主要介紹了C#使用偽隨機(jī)數(shù)實(shí)現(xiàn)加密用戶密碼的方法,對(duì)于開發(fā)C#會(huì)員系統(tǒng)或者程序安全問題都有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-07-07
  • c#獲取windows桌面背景代碼示例

    c#獲取windows桌面背景代碼示例

    這篇文章主要介紹了c#獲取windows桌面背景的方法,大家參考使用吧
    2013-12-12
  • C#的正則表達(dá)式Regex類使用簡明教程

    C#的正則表達(dá)式Regex類使用簡明教程

    這篇文章主要介紹了C#的正則表達(dá)式Regex類使用簡明教程,分別講解了如何匹配、如何獲取匹配次數(shù)、如何獲取匹配內(nèi)容及捕獲的方法,需要的朋友可以參考下
    2014-08-08
  • WCF實(shí)現(xiàn)進(jìn)程間管道通信Demo分享

    WCF實(shí)現(xiàn)進(jìn)程間管道通信Demo分享

    下面小編就為大家分享一篇WCF實(shí)現(xiàn)進(jìn)程間管道通信Demo,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • C# Socket編程實(shí)現(xiàn)簡單的局域網(wǎng)聊天器的示例代碼

    C# Socket編程實(shí)現(xiàn)簡單的局域網(wǎng)聊天器的示例代碼

    這篇文章主要介紹了C# Socket編程實(shí)現(xiàn)簡單的局域網(wǎng)聊天器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C#?wpf?通過HwndHost渲染視頻的實(shí)現(xiàn)方法

    C#?wpf?通過HwndHost渲染視頻的實(shí)現(xiàn)方法

    日常開發(fā)中,特別是音視頻開發(fā),需要在界面上渲染視頻,比如制作一個(gè)播放器、或者視頻編輯工具、以及視頻會(huì)議客戶端。通常拿到的是像素格式數(shù)據(jù),此時(shí)需要渲染到wpf窗口上就需要一定的方法,本文介紹一種通過hwnd渲染的方法,控件既能提供hwnd又能嵌入wpf窗口里
    2021-11-11
  • C#實(shí)現(xiàn)獲取MAC地址的方法

    C#實(shí)現(xiàn)獲取MAC地址的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)獲取MAC地址的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • 詳解C#如何將枚舉以下拉數(shù)據(jù)源的形式返回給前端

    詳解C#如何將枚舉以下拉數(shù)據(jù)源的形式返回給前端

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)將枚舉以下拉數(shù)據(jù)源的形式返回給前端,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • c#版json數(shù)據(jù)解析示例分享

    c#版json數(shù)據(jù)解析示例分享

    JSON(全稱為JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它是基于JavaScript語法標(biāo)準(zhǔn)的一個(gè)子集。 JSON采用完全獨(dú)立于語言的文本格式,可以很容易在各種網(wǎng)絡(luò)、平臺(tái)和程序之間傳輸。JSON的語法很簡單,易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成
    2014-03-03
  • C#基礎(chǔ)教程之類class與結(jié)構(gòu)struct的區(qū)別

    C#基礎(chǔ)教程之類class與結(jié)構(gòu)struct的區(qū)別

    struct是值類型,創(chuàng)建一個(gè)struct類型的實(shí)例被分配在棧上,class是引用類型,創(chuàng)建一個(gè)class類型實(shí)例被分配在托管堆上,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)教程之類class與結(jié)構(gòu)struct區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評(píng)論

峨眉山市| 林周县| 理塘县| 会东县| 安康市| 什邡市| 阿拉善盟| 墨竹工卡县| 聂荣县| 青冈县| 墨江| 迁西县| 健康| 临汾市| 象州县| 汝城县| 阿坝| 会泽县| 昂仁县| 青铜峡市| 永春县| 诏安县| 新津县| 民乐县| 怀化市| 交城县| 利川市| 萨嘎县| 措美县| 龙泉市| 台北县| 通渭县| 邳州市| 姜堰市| 永清县| 呼和浩特市| 铜鼓县| 新安县| 聂荣县| 穆棱市| 莫力|