/// <summary> /// 注册Rest服务(跨微服务之间的同步通讯) /// </summary> /// <typeparam name="TRestClient">Rpc服务接口</typeparam> /// <param name="serviceName">在注册中心注册的服务名称,或者服务的Url</param> /// <param name="policies">Polly策略</param> protected virtual void AddRestClient <TRestClient>(string serviceName, List <IAsyncPolicy <HttpResponseMessage> > policies) where TRestClient : class { var addressNode = RpcAddressInfo.FirstOrDefault(x => x.Service.EqualsIgnoreCase(serviceName)); if (addressNode is null) { throw new NullReferenceException(nameof(addressNode)); } Services.TryAddScoped <CacheDelegatingHandler>(); Services.TryAddScoped <TokenDelegatingHandler>(); Services.TryAddScoped <ConsulDiscoverDelegatingHandler>(); Services.TryAddScoped <TokenFactory>(); var registeredType = Configuration.GetRegisteredType().ToLower(); //注册RefitClient,设置httpclient生命周期时间,默认也是2分钟。 var contentSerializer = new SystemTextJsonContentSerializer(SystemTextJson.GetAdncDefaultOptions()); var refitSettings = new RefitSettings(contentSerializer); var clientbuilder = Services.AddRefitClient <TRestClient>(refitSettings) .SetHandlerLifetime(TimeSpan.FromMinutes(2)) .AddPolicyHandlerICollection(policies) //.UseHttpClientMetrics() .AddHttpMessageHandler <CacheDelegatingHandler>() .AddHttpMessageHandler <TokenDelegatingHandler>(); switch (registeredType) { case RegisteredTypeConsts.Direct: { clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.Direct)); break; } case RegisteredTypeConsts.ClusterIP: { clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.CoreDns)); break; } case RegisteredTypeConsts.Consul: { clientbuilder.ConfigureHttpClient(httpClient => httpClient.BaseAddress = new Uri(addressNode.Consul)) .AddHttpMessageHandler <ConsulDiscoverDelegatingHandler>(); break; } } }
public void StreamDeserialization_UsingSystemTextJsonContentSerializer_SetsCorrectHeaders() { var model = new TestAliasObject { ShortNameForAlias = nameof(StreamDeserialization_UsingSystemTextJsonContentSerializer), ShortNameForJsonProperty = nameof(TestAliasObject) }; var serializer = new SystemTextJsonContentSerializer(); var json = serializer.ToHttpContent(model); Assert.NotNull(json.Headers.ContentType); Assert.Equal("utf-8", json.Headers.ContentType.CharSet); Assert.Equal("application/json", json.Headers.ContentType.MediaType); }
public void HttpClientSettingsCanBeProvidedStaticallyGivenTypeArgument() { var contentSerializer = new SystemTextJsonContentSerializer(new JsonSerializerOptions()); var serviceCollection = new ServiceCollection(); serviceCollection.AddRefitClient <IFooWithOtherAttribute>(new RefitSettings() { ContentSerializer = contentSerializer }); var serviceProvider = serviceCollection.BuildServiceProvider(); Assert.Same( contentSerializer, serviceProvider.GetRequiredService <SettingsFor <IFooWithOtherAttribute> >().Settings !.ContentSerializer ); }
/// <summary> /// Create an implementation of <see cref="IBankMasterClient"/> wit Refit configured to use System.Text.Json for JSON deserialization. /// </summary> /// <param name="httpMessageHandlerFactory">Optionally supply a custom inner <see cref="HttpMessageHandler"/>.</param> /// <returns>An implementation of <see cref="IBankMasterClient"/> using System.Text.Json.</returns> public static IBankMasterClient CreateSystemTextJsonClient(Func <HttpMessageHandler>?httpMessageHandlerFactory = null) { var jsonSerializerOptions = new JsonSerializerOptions { Converters = { new JsonStringEnumMemberConverter() }, PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; jsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); var contentSerializer = new SystemTextJsonContentSerializer(jsonSerializerOptions); var settings = new RefitSettings(contentSerializer) { HttpMessageHandlerFactory = httpMessageHandlerFactory }; return(RestService.For <IBankMasterClient>(BaseUri.ToString(), settings)); }
public async Task StreamDeserialization_UsingSystemTextJsonContentSerializer_SetsCorrectHeaders() { var model = new TestAliasObject { ShortNameForAlias = nameof(StreamDeserialization_UsingSystemTextJsonContentSerializer), ShortNameForJsonProperty = nameof(TestAliasObject) }; var serializer = new SystemTextJsonContentSerializer(); var json = await serializer.SerializeAsync(model); Assert.NotNull(json.Headers.ContentLength); Assert.True(json.Headers.ContentLength.Value > 0); Assert.NotNull(json.Headers.ContentType); Assert.Equal("utf-8", json.Headers.ContentType.CharSet); Assert.Equal("application/json", json.Headers.ContentType.MediaType); }
public async Task StreamDeserialization_UsingSystemTextJsonContentSerializer() { var model = new TestAliasObject { ShortNameForAlias = nameof(StreamDeserialization_UsingSystemTextJsonContentSerializer), ShortNameForJsonProperty = nameof(TestAliasObject) }; var serializer = new SystemTextJsonContentSerializer(); var json = serializer.ToHttpContent(model); var result = await serializer.FromHttpContentAsync <TestAliasObject>(json); Assert.NotNull(result); Assert.Equal(model.ShortNameForAlias, result.ShortNameForAlias); Assert.Equal(model.ShortNameForJsonProperty, result.ShortNameForJsonProperty); }
public async Task StreamDeserialization_UsingSystemTextJsonContentSerializer() { var model = new TestAliasObject { ShortNameForAlias = nameof(StreamDeserialization_UsingSystemTextJsonContentSerializer), ShortNameForJsonProperty = nameof(TestAliasObject) }; var serializer = new SystemTextJsonContentSerializer(); var json = await serializer.SerializeAsync(model); var stream = await json.ReadAsStreamAsync(); var result = await System.Text.Json.JsonSerializer.DeserializeAsync <TestAliasObject>(stream); Assert.NotNull(result); Assert.Equal(model.ShortNameForAlias, result.ShortNameForAlias); Assert.Equal(model.ShortNameForJsonProperty, result.ShortNameForJsonProperty); }