【发布时间】:2022-10-07 19:49:47
【问题描述】:
我阅读了我能找到的关于HttpClientFactory 的所有内容,经过几天的努力,我即将放弃,但在这里抓住机会以防有人能提供帮助。我只是想在我的 .net 4.7.2 Winforms 应用程序中为 rest-api 客户端实现HttpClientFactory。
我尝试实现 Typed 和 Named 客户端,但是每次我尝试在我的代码中实例化它时都会得到一个空引用。所以这里我到目前为止做了什么:
对于 Typed Client,我创建了一个类:
Imports System.Net.Http
Imports Microsoft.Extensions.Http
Imports Microsoft.Extensions.DependencyInjection
Public Class TypedCustomHTTPClient
Public Property _Client() As HttpClient
Public Sub New(ByVal httpClient As HttpClient)
'httpClient.BaseAddress = New Uri("https://api.google.com/")
httpClient.DefaultRequestHeaders.Add("Accept", "application/json")
httpClient.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample")
_Client = httpClient
End Sub
End Class
然后我的 Project Main Sub 我正在注册我的 Typed Client 也是一个 Named Client(我不确定我是否以正确的方式进行操作)
Imports Microsoft.Extensions.DependencyInjection
Imports Microsoft.Extensions.Hosting
Imports Microsoft.Extensions.Http
Imports Polly
Module MainModule
Public Sub Main()
Dim seviceColl As New ServiceCollection
'
'--------Registering and injecting HttpClients (by Name)
seviceColl.AddHttpClient("s2sfHTTPClient", Sub(c)
'c.BaseAddress = New Uri("https://api.google.com/")
c.DefaultRequestHeaders.Add("Accept", "application/json")
End Sub).AddPolicyHandler(PolHolder.httpRetryWithReauthorizationPolicy())
seviceColl.AddHttpClient("GitHub", Sub(httpClient)
httpClient.BaseAddress = New Uri("https://api.github.com/")
' using Microsoft.Net.Http.Headers;
' The GitHub API requires two headers.
''httpClient.DefaultRequestHeaders.Add(HeaderNames.Accept, "application/vnd.github.v3+json")
''httpClient.DefaultRequestHeaders.Add(HeaderNames.UserAgent, "HttpRequestsSample")
End Sub)
'Registering and injecting HttpClients (by Type)
seviceColl.AddHttpClient(Of TypedCustomHTTPClient)().SetHandlerLifetime(TimeSpan.FromMinutes(5)).AddPolicyHandler(PolHolder.httpRetryWithReauthorizationPolicy()) 'Set lifetime to five minutes
'Building Service Provider
Dim serviceprovider = servicecoll.BuildServiceProvider
'
'
'
Application.Run(New Form1()) ''//Use your main form here
End Sub
End Module
当我尝试使用类型化客户端或命名客户端(应使用.CreateClient 方法)时,我在CreateClient 行上收到空引用错误。
Private Property _httpClientFactory As IHttpClientFactory
Public Function TestQuery2(ByVal soqlQuery As String) As String
Dim customclient = _httpClientFactory.CreateClient("s2sfHTTPClient")
'Using customclient._Client '= New HttpClient()
'
Dim restRequest As String = InstanceUrl + API_ENDPOINT & "query/?q=" & soqlQuery
Dim request = New HttpRequestMessage(HttpMethod.[Get], restRequest)
request.Headers.Add("Authorization", "Bearer " & AuthToken)
request.Headers.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
request.Headers.Add("X-PrettyPrint", "1")
Dim response = customclient.SendAsync(request).Result
Return response.Content.ReadAsStringAsync().Result
'End Using
End Function
任何想法?我究竟做错了什么?
【问题讨论】:
-
如果您在 CreateClient 行收到 NullReferenceException,这意味着 IHttpClientFactory 为空。
-
根据共享代码,我无法发现您在 ServiceCollection 上调用 BuildServiceProvider 的位置。
-
@PeterCsala 感谢您的回复。我在发布后不久就发现了这一点,但即使我将 .BuildServiceProvider 行添加到我的 Main Sub(请参阅我的问题中的更新代码),我似乎无法从我的其他任何地方获得对我正在创建的 HttpclientFactory 的引用代码。这是为什么?我什至尝试使用 SimpleInjector 容器,但仍然没有运气。我如何获得对我从主子创建的 httpclientfactory 的引用?在网上找到的所有关于这个的文档都说上面应该可以工作,但是找到的所有信息主要是指.net核心,而不是完整的框架
标签: vb.net dotnet-httpclient polly .net-4.7.2 ihttpclientfactory