一個HttpClient使用Windows認證請求WCF服務的例子

来源:http://www.cnblogs.com/VAllen/archive/2017/07/26/HttpClient-Use-Authenticate-Request-Local-WCF-Services.html
-Advertisement-
Play Games

有個項目需要調用第三方SDK,而SDK獲取伺服器的已安裝的特殊印表機列表返回給調用方。 但我不想依賴這個SDK,因為這個SDK是使用.NET Framework編寫的,而我的項目是使用.NET Core編寫的,並且想要部署在Docker容器內運行。 於是反編譯了SDK,查看源代碼,看到該SDK調用了 ...


有個項目需要調用第三方SDK,而SDK獲取伺服器的已安裝的特殊印表機列表返回給調用方。

但我不想依賴這個SDK,因為這個SDK是使用.NET Framework編寫的,而我的項目是使用.NET Core編寫的,並且想要部署在Docker容器內運行。

於是反編譯了SDK,查看源代碼,看到該SDK調用了一個URL獲取結果。

而這個URL是本地URL,http://localhost開頭的,此時我才知道這個SDK所對應的軟體在伺服器提供了一個本地的Web服務。

於是我在項目里移除這個SDK,直接調用URL。

但獲取結果失敗了,提示“響應狀態代碼不指示成功: 401 (Unauthorized)。”。而直接瀏覽器訪問這個URL卻成功返回結果。

 

剛開始一臉懵逼,不知道原來是沒有認證的原因在作梗...

很習慣性的就祭出Fiddler監聽這個URL,在瀏覽器里直接訪問這個URL,在Fiddler卻看到這個URL被請求了3次。

當時沒有在意,直接拿到Request Header,塞到HttpClient的Header里,再次請求,還是報錯。

重新粗略地看Fiddler,這時才留意到重覆請求3次的問題。

我以為是請求內重定向,設置AllowAutoRedirect為true,再次請求,又報錯。

又重新仔細地逐條看Fiddler,第二條在Request Header出現了Authorization: Negotiate xxxxxxxxx。

 

這才知道用了Authorization認證,於是我根據URL埠查到Windows的埠占用列表,順便找到了該埠占用所對應的PID。

找到PID就找到了進程,從而找到進程所在的文件夾目錄,查看它的config配置文件,從配置描述來看,這個Web服務更準確來講是一個WCF服務。

它使用了security節點:

<security mode="TransportCredentialOnly">
  <transport clientCredentialType="Windows"></transport>
</security>

我設置UseDefaultCredentials為true,再次請求,成功獲取結果。

這是HttpClient請求本地WCF服務 最終代碼:

private static async void Test()
{
    Random rand = new Random();
    var r = rand.Next(10000, 99999);
    string url = "http://localhost:8080/WebPrintService/GetClientPrinters?rand=" + r;

    var handler = new HttpClientHandler();
    //handler.AllowAutoRedirect = true;
    //handler.UseDefaultCredentials = true;
    //handler.PreAuthenticate = true;

    HttpClient httpClient = new HttpClient(handler);
    
    //HttpRequestMessage requestMessage = new HttpRequestMessage();
    //requestMessage.RequestUri = new Uri(url);
    //requestMessage.Method = HttpMethod.Get;
    
    //requestMessage.Headers.CacheControl.MaxAge = TimeSpan.Zero;
    //requestMessage.Headers.Authorization=new AuthenticationHeaderValue();
    
    //requestMessage.Headers.Accept.Clear();
    //requestMessage.Headers.Accept.ParseAdd("application/json, text/javascript, */*; q=0.01");
    
    //requestMessage.Headers.AcceptEncoding.Clear();
    //requestMessage.Headers.AcceptEncoding.ParseAdd("gzip, deflate");
    
    //requestMessage.Headers.AcceptLanguage.Clear();
    //requestMessage.Headers.AcceptLanguage.ParseAdd("zh-CN");
    
    //requestMessage.Headers.UserAgent.Clear();
    //requestMessage.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");

    //requestMessage.Headers.Add("X-Requested-With", "XMLHttpRequest");
    
    //var responseMessage = await httpClient.SendAsync(requestMessage);
    //var result = await responseMessage.Content.ReadAsStringAsync();
    
    var result = await httpClient.GetStringAsync(url);
    JsonConvert.DeserializeObject<PrinterInfo>(jsonString);
    
    //第二種寫法,.NET Framework自帶,無須為了HttpClient使用NuGet引入Microsoft.Net.Http包
    //WebRequest request = WebRequest.Create(url);
    //request.Method = "GET";
    //request.UseDefaultCredentials = true;
    //WebResponse response = request.GetResponse();
    //var stream = response.GetResponseStream();
    //using (var streamReader = new StreamReader(stream))
    //{
    //    using (var textReader = new JsonTextReader(streamReader))
    //    {
    //        var serializer = new JsonSerializer();
    //        var result = serializer.Deserialize<List<PrinterInfo>>(textReader);
    //    }
    //}
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • nopCommerce 3.9 中插件類型整理,詳細介紹 IWidgetPlugin 插件顯示原理,載入流程分析。 ...
  • 對於使用集群,負載均衡組件是必不可少的。包括在應用層和服務層都可以使用負載均衡。 負載均衡 我瞭解的負載均衡分兩種,使用硬體:F5和A10,和使用開源軟體:Nginx和LVS。 這裡先做個記錄,後面研究了之後再來補充。 ...
  • 搜索引擎在大型網站中也非常重要,尤其是對於大數據的處理方面,比如日誌的實時收集和分析。 搜索引擎 我研究的是ElasticSearch,最好要研究整個ELK解決方案。 先記錄在這裡,等研究完了再來完善!!! ...
  • 引言 因為工作內容的原因需要相容 XP,而 XP 最多支持到.Net Framework 4.0。因此無法享受到 .Net Core 帶來的一堆很好用的庫,好在無論 corefx 還是 Asp.Net Core 都是開源的,我們可以自行修改編譯出支持 .Net 4.0 的版本。 技術可行性 Net ...
  • NoSQL最常見的解釋是non-relational,或者not only SQL,從欄位意思上就可以看出,它是指非關係型資料庫的統稱。 NoSQL誕生的背景 隨著大型網站分散式架構的發展,使用傳統關係型資料庫在以下幾個方面顯得力不從心: 1,對資料庫高併發讀寫 隨著分散式架構和微服務的流行,資料庫 ...
  • 13.1 類和介面繼承 13.2 定義介面 C 用 interface 關鍵字定義介面.介面中可定義方法,事件,無參屬性和有參屬性(C 的索引器),但不能定義任何構造器方法,也不能定義任何實例欄位. 13.3 繼承介面 C 編譯器要求將實現介面的方法(簡稱為"介面方法")標記為public. CLR ...
  • https://netftp.codeplex.com/SourceControl/latest http://ftplib.codeplex.com/ https://www.codeproject.com/articles/18537/c-ftp-client-library https://w ...
  • 程式不複雜,直接上代碼了: 運行效果如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...