我创建了一个ViewComponent
类,它使用HttpClient
调用REST API
,代码如下:
public class ProductsViewComponent : ViewComponent
{
private readonly HttpClient _client;
public ProductsViewComponent(HttpClient client)
{
_client = client ?? throw new ArgumentNullException(nameof(client));
}
public async Task<IViewComponentResult> InvokeAsync(string date)
{
using(var response = await _client.GetAsync($"/product/get_products/{date}"))
{
response.EnsureSuccessStatusCode();
var products = await response.Content.ReadAsAsync<List<Products>>();
return View(products);
}
}
}
我得到这个错误:
InvalidOperationException:在尝试激活MyApp.ViewComponents.ProductsViewComponent时无法解析类型“System.Net.Http.HttpClient”的服务。
我以这种方式将HttpClient
注入到Startup
中的ConfigureService
方法中:
services.AddHttpClient<FixturesViewComponent>(options =>
{
options.BaseAddress = new Uri("http://80.350.485.118/api/v2");
});
更新:
我也注册了ProductsViewComponent
,同样的错误。
7条答案
按热度按时间w41d8nur1#
我有一个类似的问题-问题是在双重注册:
类似的例子[只是添加以澄清它不是特定于AddSingleton,也不是与顺序有关。
hmtdttj42#
TLDR;
ViewComponent
s不支持开箱即用的类型化客户端。要解决这个问题,请在services.AddMvc(...)
调用的末尾添加AddViewComponentsAsServices()
调用。经过一个相当长的chat运行的背面能够重现您的问题,我们最初确定,正在观察的问题是特定于
ViewComponent
的。即使调用了IServiceCollection.AddHttpClient<SomeViewComponent>()
,将HttpClient
的示例传递到SomeViewComponent
的构造函数中也拒绝工作。但是,在 *
SomeComponent
和HttpClient
之间放置一个新类(SomeService
)*,就可以正常工作。这就是文档中所说的类型化客户端。代码看起来有点像这样:正如我已经说过的,这种方法是有效的-ASP.NETCoreDI系统非常乐意创建
SomeService
的示例及其类型化的HttpClient
示例。要重述原始问题,请使用以下示例代码:
在这种情况下,ASP.NETCoreDI系统由于无法解析
HttpClient
而拒绝创建SomeViewComponent
的示例。事实证明,这并不特定于ViewComponent
s:它也适用于Controller
s和TagHelper
s(感谢Chris Pratt确认TagHelper
s)。有趣的是,下面的方法也有效:
在本例中,我们利用了对
AddHttpClient<SomeViewComponent>
的调用为我们注册了一个命名客户端的事实。为了能够将
HttpClient
直接注入到ViewComponent
中,我们可以在使用DI注册MVC时添加对AddViewComponentsAsServices
的调用:也可以调用
AddControllersAsServices
和AddTagHelpersAsServices
分别为Controller
s和TagHelpers
添加相同的支持。如果我们更仔细地查看文档,很明显没有一个示例将
HttpClient
注入到Controller
s等人-根本没有提到这种方法。不幸的是,我对ASP.NET Core DI系统的了解还不够,无法准确解释它的工作方式:我上面提供的信息只是简单地解释了解决方案的沿着内容。Chris Pratt已经在Github上打开了一个issue文档,以便在此基础上进行更新。
3hvapo4f3#
我在
Azure Function
版本2中遇到了类似的错误。根据this document,我们应该能够添加IHttpClientFactory
作为依赖项。在我的Azure函数中添加这个DI
之后,我得到了下面提到的错误。Microsoft.Extensions.DependencyInjection.Abstractions:在尝试激活“OServiceBus.Adapter.FetchDataFromSubscription1”时无法解析类型“System.Net.Http.IHttpClientFactory”的服务
问题是我没有覆盖Configure函数来将
HttpClient
添加为注册依赖项。因此,我在Azure Function的根目录中创建了一个名为Statup
的类,如下所示。使用Microsoft.Azure.Functions.Extensions.DependencyInjection;使用Microsoft.Extensions.DependencyInjection;
添加此功能后,我的功能开始正常工作。希望有帮助。
5sxhfpxr4#
我在尝试将外部REST服务的 Package 器作为接口注入到我的控制器时也遇到了类似的错误消息。我需要在ConfigureServices中更改以下内容:
到
为了能够在我的控制器的构造函数中使用接口:
使用模拟服务测试myController时非常有用。
mwngjboj5#
看起来你把两个视图组件弄混了。您正在将
FixturesViewComponent
注册为“命名HTTP客户端”,但您试图在ProductsViewComponent
中注入HttpClient
示例。将HttpClient注册更改为
ProductsViewComponent
应该有助于:wb1gzix06#
也许这会有帮助,但在我的情况下,这是有效的:
我也试过
services.AddHttpClient<IMyService>()
,由于缺少它的构造函数,它无法解决。如上所述,还尝试了services.AddHttpClient<MyService>()
,但它无法解析配置的示例。因此,重要的部分是需要使用用于引用解析类型的类。这也是可行的:
这有点道理,但文档和示例可能会更好。
ht4b089n7#
对我来说,解决办法是添加: