예제 #1
0
    /// <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;
        }
        }
    }
예제 #2
0
        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
                );
        }
예제 #4
0
        /// <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));
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }