如何创建绑定HttpClient的服务实例?

时间:2019-09-19 08:08:58

标签: c# identityserver4 asp.net-core-3.0

我的服务中托管了Identity Server 4。它公开了各种端点,我想从同一服务访问token端点。 它不公开任何接口,因此我可以将其作为依赖项注入,因此我必须发出一个http请求。

现在,我像这样设置HttpClient的网址:

var req = _contextAcessor.HttpContext.Request;
var baseAddr = $"{req.Scheme}://{req.Host}";
client.BaseAddress = new Uri(baseAddr);

var addr = _urlHelperProvider.GetUrlHelper().Content("~/connect/token");

我不喜欢它,因为这里甚至没有使用localhost。但是服务可能绑定到localhost上的其他端口,并且我不知道如何获取传递到UseUrls方法的URL列表。

理想情况下,我希望将绑定到我的服务的客户端实例与WebApplicationFactory.CreateClient方法的工作方式类似。

1 个答案:

答案 0 :(得分:0)

希望在这里找到答案,但最终使其成功了 因此,希望这可以对某人有所帮助

在创建客户端时,使用https设置主机通常可能会有所帮助 它应等于在本地运行应用程序时默认情况下拥有的任何主机

_factory = new WebApplicationFactory<Startup>().WithWebHostBuilder(BuildHost);
        Client = _factory.CreateClient(new WebApplicationFactoryClientOptions()
        {
            BaseAddress = new System.Uri("https://localhost:5031")
        });

然后您的请求很简单:

var parameters = new Dictionary<string, string> { { "grant_type", "client_credentials" },
            { "scope", "SomeScope" }, 
            { "client_id", "YourClientId" }, { "client_secret", "yoursecret" } };


        var encodedContent = new FormUrlEncodedContent(parameters);

        var response = await Client.PostAsync("/connect/token", encodedContent);

已经在本地测试过,并且可以正常工作 如果您的设置仍有问题,请告诉我, 应该能够提供帮助