0

我正在使用System.Net.Http.HttpClient與後端MVC4應用程序中的RESTful服務交談。根據提出請求的用戶,身份驗證標頭與RESTful服務的通信會有所不同,因此應該爲每個用戶緩存標頭中設置的值。這些值在會話的整個生命週期中可能會更改。.NET MVC HttpClient生命週期

我正在使用StructureMap for DI。有些問題:

  1. 根據this聽起來應該有HttpClient的的所有請求的單個實例。雖然some say直接注入HttpClient可能是一個壞主意,因爲它是IDisposabe,others say它沒有必要處置它。那麼,注入HttpClient的最佳方法是什麼?
  2. HttpClient的單個實例可能會在運行期間被丟棄或失效(可能是REST服務器重新啓動)?如果是這樣,那麼我認爲沒有選擇直接注入HttpClient,它必須包裝在一個管理器類中,該類將檢查HttClient實例是否有效,並在出現問題時實例化新客戶端。問題是我沒有看到一種方式進行測試。
  3. 哪裏是緩存用戶特定認證頭信息的最佳位置?我不認爲從控制器傳遞信息到服務層是乾淨的,因爲它似乎是suggested here,所以我認爲HttpSession在數據層中的注入對象範圍是這裏的方式,但是會愛上聽取其他想法。

回答

0

當您的MVC4應用程序啓動時創建HttpClient,並在關閉時處理它。如果使用HttpClient調用的服務器重新啓動,則不需要您創建HttpClient的新實例。 TCP連接在ServicePointManager的封面下獨立管理。

我不明白你關於用戶特定認證信息的問題。您是否試圖讓您的MVC網站在您致電RESTful服務時冒充用戶?如果是這樣,那麼只需在每個請求上設置Auth頭。

+0

你究竟如何創建/注入單身HttpClient - 裸體或與一些經理/包裝?關於設置auth頭文件,我正在詢問在構建頭文件值時將用於存儲/緩存用戶信息的位置。在我的情況下,它是授權標題,但可以應用於每個用戶在每個請求上需要提交的任何內容。 – Alex

+0

我想我需要澄清的是,傳遞給標題的用戶信息將在每個新會話開始時確定。我會更新我原來的問題。 – Alex

+0

@Alex我會嘗試使用HttpClient裸體。包裝HttpClient可能會很痛苦。 –