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

C# 如何创建服务绑定HttpClient的实例?,c#,identityserver4,asp.net-core-3.0,C#,Identityserver4,Asp.net Core 3.0,我的服务中托管了Identity Server 4。它公开了各种端点,我想从同一个服务访问token端点。 它不公开任何接口,所以我可以将其作为依赖项注入,因此我必须发出http请求 现在我设置HttpClient的URL如下: var req = _contextAcessor.HttpContext.Request; var baseAddr = $"{req.Scheme}://{req.Host}"; client.BaseAddress = new Uri(baseAddr); va

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

现在我设置
HttpClient
的URL如下:

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

var addr = _urlHelperProvider.GetUrlHelper().Content("~/connect/token");
我不喜欢它,因为这里甚至没有使用
localhost
。但服务可能绑定到本地主机上的不同端口,我不知道如何获得传递给该方法的URL列表


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

希望在这里找到答案,但最终使它工作起来 所以希望这能帮助一些人

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

_factory = new WebApplicationFactory<Startup>().WithWebHostBuilder(BuildHost);
        Client = _factory.CreateClient(new WebApplicationFactoryClientOptions()
        {
            BaseAddress = new System.Uri("https://localhost:5031")
        });
\u factory=new WebApplicationFactory(),带有WebHostBuilder(BuildHost);
Client=\u factory.CreateClient(新的WebApplicationFactoryClientOptions()
{
BaseAddress=新的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);
var parameters=newdictionary{{“grant\u type”,“client\u credentials”},
{“scope”,“SomeScope”},
{“客户id”、“YourClientId”}、{“客户机密”、“yoursecret”};
var encodedContent=新表单URLEncodedcontent(参数);
var response=wait Client.PostAsync(“/connect/token”,encodedContent);
我们已经在本地测试了它,它可以工作了 如果您的设置还有任何问题,请告诉我,
应该能够帮助

在解析时遇到问题--您是否询问如何在DI容器中注册绑定配置的HttpClient?不,如何获取基址指向我的服务的http客户端?或者http客户端,其处理程序甚至不使用网络,而仅使用内存。如果您与Identity Server 4处于相同的过程中,您是否研究过使用
Identity Server Tools
内部生成令牌?见@Richard是的,同样的过程。我看了一下工具,它们只是用来发布令牌的,但endpoint做的更多。它不仅与IS4有关,还与托管在同一进程中并可以在内存中访问的所有其他内容有关。我不确定我是否得到了您真正需要的内容,但可能类似于
公共静态字符串GetIdentityServerBaseUrl(此HttpContext上下文)
来自
IdentityServer4.Extensions
命名空间。如您所见,这是HttpContext的扩展方法,因此可以通过以下方式从任何控制器调用它:
HttpContext.GetIdentityServerBaseUrl()