在具有.net core 3.1和.net framework 4.7.2的项目中使用httpclientfactory

问题描述

我将旧的CMS从WebForms .Fet Framework升级到.net核心。我先从实现了httpclientfactory的前端开始。

在我升级后端之前,我想在.net核心和.net框架解决方案上使用相同的数据层,但是我很难在WebForms解决方案中实现它

在我的API帮助器类中(可从Web窗体和.net核心访问),我实现了以下内容

private IHttpClientFactory _httpClientFactory;
public WebSite(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

获取数据的函数是:

public async Task<WebSite> GetSingle(int id)
{
   var client = _httpClientFactory.CreateClient();     // and so on ///      
}

在.net核心解决方案上,我像这样初始化HttpClientFactory:

private readonly IHttpClientFactory _clientFactory;
private readonly WebSite _webSite;

在网络核心解决方案中,初始化IHttpClientFactory

public IndexModel(IHttpClientFactory clientFactory)
{
   _clientFactory = clientFactory;
   _webSite = new WebSite(_clientFactory);
}

然后我得到像这样的数据:

WebSite currentWebsite = _webSite.GetSingle(1);

我已经在WebForms应用程序中完成了以下操作:

已安装

Autofac.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Http

将以下内容添加到global.asax

public static IServiceProvider ServiceProvider;

protected void Application_Start(object sender,EventArgs e)
{
    var hostBuilder = new HostBuilder();
    hostBuilder.ConfigureServices(ConfigureServices);
    var host = hostBuilder.Build();
    ServiceProvider = host.Services;
}

void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient(); //extension method that add IHttpClientFactories
    var providerFactory = new AutofacServiceProviderFactory();
    providerFactory.CreateBuilder(services);
}

问题是,如何将httpclientfactoryclient注入我的WebForms应用程序中,以便可以像.net核心解决方案一样使用_webSite.GetSingle(1)

解决方法

团结解决了这个问题。

在Global.asax中注册了一个容器

var container = Microsoft.AspNet.WebFormsDependencyInjection.Unity.UnityAdapter.AddUnity();
container.RegisterType<IHttpClientFactory,CMSHttpClientFactory>();

其中CMSHttpClientFactory是IHttpClientFactory的非常简单的实现

创建了一个基础System.Web.UI.Page(以及UserControl和MasterPage),在这里我再次获得了clientfactory

public IHttpClientFactory _httpClientFactory;

public BasePage()
{
   var container = Microsoft.AspNet.WebFormsDependencyInjection.Unity.UnityAdapter.GetContainer();
   _httpClientFactory = container.Resolve<Api.CMSHttpClientFactory>();
}

然后我再次传递给我的Helperclass。现在我可以在.net core和webfors 4.7.2上使用相同的API调用