问题描述
我正在尝试关注DryIoc and IServiceProvider on Prism for Xamarin.Forms (DryIoc.Microsoft.DependencyInjection),但是我正在将RefitClient用于IHttpClientFactory
containerRegistry.RegisterServices(services =>
{
services.AddTransient<HttpLoggingHandler>();
services.AddTransient<AuthorizationDelegatingHandler>();
services.AddRefitClient<IMyApi>()
.ConfigureHttpClient(c =>
c.BaseAddress =
new Uri(apiBaseUrl))
.AddHttpMessageHandler<AuthorizationDelegatingHandler>()
.AddHttpMessageHandler<HttpLoggingHandler>()
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[]
{
TimeSpan.FromMilliseconds(300),TimeSpan.FromSeconds(600),TimeSpan.FromSeconds(800)
}))
.AddTransientHttpErrorPolicy(
p => p.CircuitBreakerAsync(5,TimeSpan.FromSeconds(30)));
});
我添加了
protected override IContainerExtension CreateContainerExtension() => PrismContainerExtension.Current;
当我尝试向IMyApi发出请求时。
BaseAddress must be set on the HttpClient instance
at Refit.RequestBuilderImplementation+<>c__displayClass14_0`2[T,TBody].<BuildCancellableTaskFuncForMethod>b__0 (System.Net.Http.HttpClient client,System.Threading.CancellationToken ct,System.Object[] paramList) [0x00030] in /_/Refit/RequestBuilderImplementation.cs:236
解决方法
我个人不得不处理所有这些问题,最后创建了Apizr,其中内置了身份验证和日志处理程序,可以从注册表中解析策略,还可以进行连接测试,缓存或优先级等更多功能。如果可以的话。
,我使用的是 Unity 而不是 Dryloc,但解决方案是一样的。
关键似乎很大程度上取决于安装正确的软件包。 仅安装这些:
Prism.Forms.Extended
Prism.Unity.Extensions
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//Omitted Code
containerRegistry.RegisterServices(serviceCollection =>
{
serviceCollection.AddHttpClient<IApiService,ApiService>(client =>
{
client.BaseAddress = new Uri("Your Address Here");
});
});
}
public class ApiService : IApiService
{
Func<IApi> _createClient;
public ApiService(HttpClient client)
{
_createClient = () =>
{
return RestService.For<IApi>(client,new RefitSettings
{
ContentSerializer = new NewtonsoftJsonContentSerializer()
});
}
}
public IApi GetApi()
{
return new Lazy<IApi>(() => _createClient()).Value;
}
}
部分也由这篇文章提供:
https://xamgirl.com/consuming-restful-web-service-xamarin-forms-using-refit-part-2/