c# - 使用 Blazor WebAssembly 使用第三方 API
问题描述
我有一个第三方 API (api.foo.com),受身份验证和授权保护。我无法编辑服务器设置。
我想创建一个 Blazor WebAssembly (.NET 5) 应用程序并使用这个 REST API。
在我的程序课上,
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
// builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddHttpClient<FooClient>(c => c.BaseAddress = "https://api.foo.com/v1/");
}
}
我的FooClient
:
public class FooClient
{
private readonly HttpClient _httpClient;
public FooClient(HttpClient httpClient) => _httpClient = httpClient;
public Task<Foo> GetFoo(int id) => _httpClient.GetFromJsonAsync<Foo>("foo/" + id);
// ... other as GetAll(), Edit(Foo), ...
}
当我尝试时,我的浏览器控制台显示:
CORS 策略阻止了从源“https://localhost:5001”获取“https://api.foo.com/api/Authentification”的访问权限:对预检请求的响应未通过访问控制检查:否请求的资源上存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
我尝试添加Microsoft.AspNetCore.Cors
NuGet 包并实现Startup
类的等价物。我还没有找到在哪里可以注册Startup
该类。
我尝试在我FooClient
的 as 中添加 CORS 标头:
_httpClient.DefaultRequestHeaders.Add("Access-Control-Allow-Origin", "*");
_httpClient.DefaultRequestHeaders.Add("Access-Control-Allow-Methods", "*");
_httpClient.DefaultRequestHeaders.Add("Access-Control-Allow-Headers", "*");
我尝试将 HttpMessangeHandler 添加到我的 FooClient,在Program.Main
:
builder.Services
.AddHttpClient<AltevaClient>(c => c.BaseAddress = new Uri("https://api.foo.com/v1/"))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
...并实现我自己的版本:
public class FooApiAuthorizationMessageHandler : AuthorizationMessageHandler
{
public AltevaApiAuthorizationMessageHandler(
IAccessTokenProvider provider,
NavigationManager navigationManager)
: base(provider, navigationManager)
{
ConfigureHandler(
authorizedUrls: new[] { "https://api.foo.com/v1/" },
scopes: new[] { "example.read", "example.write" });
}
}
在最后两种情况下,我的浏览器控制台显示:
致命一击:Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常呈现组件:没有为类型“Microsoft.AspNetCore.Components.WebAssembly.Authentication.BaseAddressAuthorizationMessageHandler”注册的服务。
好的!上面AddHttpClient
,我试图添加BaseAddressAuthorizationMessageHandler
服务。
builder.Services.AddScoped<BaseAddressAuthorizationMessageHandler>();
浏览器的控制台显示:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer [100] 未处理的异常呈现组件:尝试激活“Microsoft.AspNetCore.Components.WebAssembly”时无法解析类型“Microsoft.AspNetCore.Components.WebAssembly.Authentication.IAccessTokenProvider”的服务.Authentication.BaseAddressAuthorizationMessageHandler'。
而且我无法注册IAccessTokenProvider
为服务。
无法为服务类型“Microsoft.AspNetCore.Components.WebAssembly.Authentication.IAccessTokenProvider”实例化实现类型“Microsoft.AspNetCore.Components.WebAssembly.Authentication.IAccessTokenProvider”。
...而且我没有找到“默认”实现...
解决方案
推荐阅读
- r - 不使用分隔符分隔列
- python - 漏洞?在 M1 - 为每个样本分别计算梯度时优化的 TensorFlow
- google-cloud-platform - 即使我没有任何磁盘,GCP 磁盘配额仍为 100%
- spring-boot - Spring Boot DevTools - RestartClassLoader 问题
- java - netbeans java文件读取不完整
- julia - Julia - 另一个向量重复一个向量的条目(内部)
- c# - 在 Blob MYSQL c# 中插入 imaga
- qt - 在 Ubuntu 中以 root 用户身份启动 Qt 应用程序
- php - WordPress 子页面布局问题,页面未正确显示给访问者或未注销时
- python - 如何在Python中垂直将文本打印为图像上的水印