.netCore-HttpClient使用
程序员文章站
2023-12-28 15:00:16
...
namespace WebApplication1
{
public class TokenClientOptions
{
public string Address { get; set; }
public string ClientId { get; set; }
public string ClientSecret { get; set; }
}
}
using System.Net.Http;
using System.Threading.Tasks;
using IdentityModel.Client;
using Microsoft.Extensions.Options;
namespace WebApplication1
{
public class TokenClient
{
public TokenClient(HttpClient client, IOptions<TokenClientOptions> options)
{
Client = client;
Options = options.Value;
}
public HttpClient Client { get; }
public TokenClientOptions Options { get; }
public async Task<string> GetToken()
{
var response = await Client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = Options.Address,
ClientId = Options.ClientId,
ClientSecret = Options.ClientSecret
});
return response.AccessToken ?? response.Error;
}
}
}
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Polly;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddHttpClient();
services.AddHttpClient("token_client",
client => client.BaseAddress = new Uri("https://demo.identityserver.io/connect/token"));
services.Configure<TokenClientOptions>(options =>
{
options.Address = "https://demo.identityserver.io/connect/token";
options.ClientId = "client";
options.ClientSecret = "secret";
});
services.AddHttpClient<TokenClient>()
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
}));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
using System.Net.Http;
using System.Threading.Tasks;
using IdentityModel.Client;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class HomeController : Controller
{
public HomeController(IHttpClientFactory httpClientFactory)
{
HttpClientFactory = httpClientFactory;
}
public IHttpClientFactory HttpClientFactory { get; }
public TokenClient TokenClient { get; }
public IActionResult Index()
{
return View();
}
public async Task<string> NoFactory()
{
var client = new HttpClient();
var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = "https://demo.identityserver.io/connect/token",
ClientId = "client",
ClientSecret = "secret"
});
return response.AccessToken ?? response.Error;
}
public async Task<string> Simple()
{
var client = HttpClientFactory.CreateClient();
var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = "https://demo.identityserver.io/connect/token",
ClientId = "client",
ClientSecret = "secret"
});
return response.AccessToken ?? response.Error;
}
public async Task<string> WithAddress()
{
var client = HttpClientFactory.CreateClient("token_client");
var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
ClientId = "client",
ClientSecret = "secret"
});
return response.AccessToken ?? response.Error;
}
public async Task<string> Typed([FromServices] TokenClient tokenClient)
{
return await tokenClient.GetToken();
}
}
}