Browse Source

Enable nullable annotations for Volo.Abp.Http.Client

pull/17560/head
liangshiwei 3 years ago
parent
commit
caa21184c5
  1. 2
      framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs
  2. 2
      framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj
  3. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/IAbpAccessTokenProvider.cs
  4. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/NullAbpAccessTokenProvider.cs
  5. 8
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs
  6. 26
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs
  7. 21
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs
  8. 14
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs
  9. 6
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/CurrentApiVersionInfo.cs
  10. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/IClientProxyApiDescriptionFinder.cs
  11. 4
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ICurrentApiVersionInfo.cs
  12. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs
  13. 4
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs
  14. 2
      framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Proxying/HttpActionParameterHelper.cs

2
framework/src/Volo.Abp.Http.Client/Microsoft/Extensions/DependencyInjection/ServiceCollectionHttpClientProxyExtensions.cs

@ -191,7 +191,7 @@ public static class ServiceCollectionHttpClientProxyExtensions
return Activator.CreateInstance( return Activator.CreateInstance(
typeof(HttpClientProxy<>).MakeGenericType(type), typeof(HttpClientProxy<>).MakeGenericType(type),
service service
); )!;
}); });
return services; return services;

2
framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj

@ -5,6 +5,8 @@
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks> <TargetFrameworks>netstandard2.0;netstandard2.1;net7.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.Http.Client</AssemblyName> <AssemblyName>Volo.Abp.Http.Client</AssemblyName>
<PackageId>Volo.Abp.Http.Client</PackageId> <PackageId>Volo.Abp.Http.Client</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback> <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/IAbpAccessTokenProvider.cs

@ -4,5 +4,5 @@ namespace Volo.Abp.Http.Client.Authentication;
public interface IAbpAccessTokenProvider public interface IAbpAccessTokenProvider
{ {
Task<string> GetTokenAsync(); Task<string?> GetTokenAsync();
} }

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Authentication/NullAbpAccessTokenProvider.cs

@ -5,7 +5,7 @@ namespace Volo.Abp.Http.Client.Authentication;
public class NullAbpAccessTokenProvider : IAbpAccessTokenProvider, ITransientDependency public class NullAbpAccessTokenProvider : IAbpAccessTokenProvider, ITransientDependency
{ {
public Task<string> GetTokenAsync() public Task<string?> GetTokenAsync()
{ {
return Task.FromResult(null as string); return Task.FromResult(null as string);
} }

8
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyApiDescriptionFinder.cs

@ -17,7 +17,7 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
protected IVirtualFileProvider VirtualFileProvider { get; } protected IVirtualFileProvider VirtualFileProvider { get; }
protected IJsonSerializer JsonSerializer { get; } protected IJsonSerializer JsonSerializer { get; }
protected Dictionary<string, ActionApiDescriptionModel> ActionApiDescriptionModels { get; } protected Dictionary<string, ActionApiDescriptionModel> ActionApiDescriptionModels { get; }
protected ApplicationApiDescriptionModel ApplicationApiDescriptionModel { get; set; } protected ApplicationApiDescriptionModel ApplicationApiDescriptionModel { get; set; } = default!;
public ClientProxyApiDescriptionFinder( public ClientProxyApiDescriptionFinder(
IVirtualFileProvider virtualFileProvider, IVirtualFileProvider virtualFileProvider,
@ -30,7 +30,7 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
Initialize(); Initialize();
} }
public ActionApiDescriptionModel FindAction(string methodName) public ActionApiDescriptionModel? FindAction(string methodName)
{ {
return ActionApiDescriptionModels.ContainsKey(methodName) ? ActionApiDescriptionModels[methodName] : null; return ActionApiDescriptionModels.ContainsKey(methodName) ? ActionApiDescriptionModels[methodName] : null;
} }
@ -113,7 +113,7 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
return rootPath + physicalDirectoryInfo.Name.EnsureStartsWith('/'); return rootPath + physicalDirectoryInfo.Name.EnsureStartsWith('/');
} }
return fileInfo.PhysicalPath; return fileInfo.PhysicalPath!;
} }
private string GetProxyFileInfoPath(string rootPath, IFileInfo fileInfo) private string GetProxyFileInfoPath(string rootPath, IFileInfo fileInfo)
@ -123,6 +123,6 @@ public class ClientProxyApiDescriptionFinder : IClientProxyApiDescriptionFinder,
return rootPath + physicalFileInfo.Name.EnsureStartsWith('/'); return rootPath + physicalFileInfo.Name.EnsureStartsWith('/');
} }
return fileInfo.GetVirtualOrPhysicalPathOrNull(); return fileInfo.GetVirtualOrPhysicalPathOrNull()!;
} }
} }

26
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyBase.cs

@ -25,7 +25,7 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public class ClientProxyBase<TService> : ITransientDependency public class ClientProxyBase<TService> : ITransientDependency
{ {
public IAbpLazyServiceProvider LazyServiceProvider { get; set; } public IAbpLazyServiceProvider LazyServiceProvider { get; set; } = default!;
protected IClientProxyApiDescriptionFinder ClientProxyApiDescriptionFinder => LazyServiceProvider.LazyGetRequiredService<IClientProxyApiDescriptionFinder>(); protected IClientProxyApiDescriptionFinder ClientProxyApiDescriptionFinder => LazyServiceProvider.LazyGetRequiredService<IClientProxyApiDescriptionFinder>();
protected ICancellationTokenProvider CancellationTokenProvider => LazyServiceProvider.LazyGetRequiredService<ICancellationTokenProvider>(); protected ICancellationTokenProvider CancellationTokenProvider => LazyServiceProvider.LazyGetRequiredService<ICancellationTokenProvider>();
@ -42,17 +42,17 @@ public class ClientProxyBase<TService> : ITransientDependency
protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService<ICurrentApiVersionInfo>(); protected ICurrentApiVersionInfo CurrentApiVersionInfo => LazyServiceProvider.LazyGetRequiredService<ICurrentApiVersionInfo>();
protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus>(); protected ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService<ILocalEventBus>();
protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue arguments = null) protected virtual async Task RequestAsync(string methodName, ClientProxyRequestTypeValue? arguments = null)
{ {
await RequestAsync(BuildHttpProxyClientProxyContext(methodName, arguments)); await RequestAsync(BuildHttpProxyClientProxyContext(methodName, arguments));
} }
protected virtual async Task<T> RequestAsync<T>(string methodName, ClientProxyRequestTypeValue arguments = null) protected virtual async Task<T> RequestAsync<T>(string methodName, ClientProxyRequestTypeValue? arguments = null)
{ {
return await RequestAsync<T>(BuildHttpProxyClientProxyContext(methodName, arguments)); return await RequestAsync<T>(BuildHttpProxyClientProxyContext(methodName, arguments));
} }
protected virtual ClientProxyRequestContext BuildHttpProxyClientProxyContext(string methodName, ClientProxyRequestTypeValue arguments = null) protected virtual ClientProxyRequestContext BuildHttpProxyClientProxyContext(string methodName, ClientProxyRequestTypeValue? arguments = null)
{ {
if (arguments == null) if (arguments == null)
{ {
@ -67,7 +67,7 @@ public class ClientProxyBase<TService> : ITransientDependency
} }
var actionArguments = action.Parameters.GroupBy(x => x.NameOnMethod).ToList(); var actionArguments = action.Parameters.GroupBy(x => x.NameOnMethod).ToList();
if (action.SupportedVersions.Any()) if (action.SupportedVersions != null && action.SupportedVersions.Any())
{ {
//TODO: make names configurable //TODO: make names configurable
actionArguments.RemoveAll(x => x.Key == "api-version" || x.Key == "apiVersion"); actionArguments.RemoveAll(x => x.Key == "api-version" || x.Key == "apiVersion");
@ -107,7 +107,7 @@ public class ClientProxyBase<TService> : ITransientDependency
if (stringContent.IsNullOrWhiteSpace()) if (stringContent.IsNullOrWhiteSpace())
{ {
return default; return default!;
} }
return JsonSerializer.Deserialize<T>(stringContent); return JsonSerializer.Deserialize<T>(stringContent);
@ -177,7 +177,7 @@ public class ClientProxyBase<TService> : ITransientDependency
var versionParam = requestContext.Action.Parameters.FirstOrDefault(p => p.Name == "apiVersion" && p.BindingSourceId == ParameterBindingSources.Path) ?? var versionParam = requestContext.Action.Parameters.FirstOrDefault(p => p.Name == "apiVersion" && p.BindingSourceId == ParameterBindingSources.Path) ??
requestContext.Action.Parameters.FirstOrDefault(p => p.Name == "api-version" && p.BindingSourceId == ParameterBindingSources.Query); requestContext.Action.Parameters.FirstOrDefault(p => p.Name == "api-version" && p.BindingSourceId == ParameterBindingSources.Query);
return new ApiVersionInfo(versionParam?.BindingSourceId, apiVersion); return new ApiVersionInfo(versionParam?.BindingSourceId!, apiVersion);
} }
protected virtual async Task<string> GetUrlWithParametersAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion) protected virtual async Task<string> GetUrlWithParametersAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion)
@ -185,7 +185,7 @@ public class ClientProxyBase<TService> : ITransientDependency
return await ClientProxyUrlBuilder.GenerateUrlWithParametersAsync(requestContext.Action, requestContext.Arguments, apiVersion); return await ClientProxyUrlBuilder.GenerateUrlWithParametersAsync(requestContext.Action, requestContext.Arguments, apiVersion);
} }
protected virtual async Task<HttpContent> GetHttpContentAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion) protected virtual async Task<HttpContent?> GetHttpContentAsync(ClientProxyRequestContext requestContext, ApiVersionInfo apiVersion)
{ {
return await ClientProxyRequestPayloadBuilder.BuildContentAsync(requestContext.Action, requestContext.Arguments, JsonSerializer, apiVersion); return await ClientProxyRequestPayloadBuilder.BuildContentAsync(requestContext.Action, requestContext.Arguments, JsonSerializer, apiVersion);
} }
@ -199,15 +199,15 @@ public class ClientProxyBase<TService> : ITransientDependency
return configuredVersion ?? "1.0"; return configuredVersion ?? "1.0";
} }
if (requestContext.Action.SupportedVersions.Contains(configuredVersion)) if (requestContext.Action.SupportedVersions!.Contains(configuredVersion!))
{ {
return configuredVersion; return configuredVersion!;
} }
return requestContext.Action.SupportedVersions.Last(); //TODO: Ensure to get the latest version! return requestContext.Action.SupportedVersions.Last(); //TODO: Ensure to get the latest version!
} }
protected virtual async Task<string> GetConfiguredApiVersionAsync(ClientProxyRequestContext requestContext) protected virtual async Task<string?> GetConfiguredApiVersionAsync(ClientProxyRequestContext requestContext)
{ {
var clientConfig = ClientOptions.Value.HttpClientProxies.GetOrDefault(requestContext.ServiceType) var clientConfig = ClientOptions.Value.HttpClientProxies.GetOrDefault(requestContext.ServiceType)
?? throw new AbpException($"Could not get DynamicHttpClientProxyConfig for {requestContext.ServiceType.FullName}."); ?? throw new AbpException($"Could not get DynamicHttpClientProxyConfig for {requestContext.ServiceType.FullName}.");
@ -220,8 +220,8 @@ public class ClientProxyBase<TService> : ITransientDependency
{ {
await LocalEventBus.PublishAsync(new ClientProxyExceptionEventData() await LocalEventBus.PublishAsync(new ClientProxyExceptionEventData()
{ {
StatusCode = (int?)response?.StatusCode, StatusCode = (int?)response.StatusCode,
ReasonPhrase = response?.ReasonPhrase ReasonPhrase = response.ReasonPhrase
}); });
if (response.Headers.Contains(AbpHttpConsts.AbpErrorFormat)) if (response.Headers.Contains(AbpHttpConsts.AbpErrorFormat))

21
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyRequestPayloadBuilder.cs

@ -40,8 +40,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
HttpClientProxyingOptions = httpClientProxyingOptions.Value; HttpClientProxyingOptions = httpClientProxyingOptions.Value;
} }
[CanBeNull] public virtual async Task<HttpContent?> BuildContentAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion)
public virtual async Task<HttpContent> BuildContentAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion)
{ {
var body = await GenerateBodyAsync(action, methodArguments, jsonSerializer); var body = await GenerateBodyAsync(action, methodArguments, jsonSerializer);
if (body != null) if (body != null)
@ -54,7 +53,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
return body; return body;
} }
protected virtual Task<HttpContent> GenerateBodyAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer) protected virtual Task<HttpContent?> GenerateBodyAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments, IJsonSerializer jsonSerializer)
{ {
var parameters = action var parameters = action
.Parameters .Parameters
@ -63,7 +62,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
if (parameters.Length <= 0) if (parameters.Length <= 0)
{ {
return Task.FromResult<HttpContent>(null); return Task.FromResult<HttpContent?>(null);
} }
if (parameters.Length > 1) if (parameters.Length > 1)
@ -76,13 +75,13 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
var value = HttpActionParameterHelper.FindParameterValue(methodArguments, parameters[0]); var value = HttpActionParameterHelper.FindParameterValue(methodArguments, parameters[0]);
if (value == null) if (value == null)
{ {
return Task.FromResult<HttpContent>(null); return Task.FromResult<HttpContent?>(null);
} }
return Task.FromResult<HttpContent>(new StringContent(jsonSerializer.Serialize(value), Encoding.UTF8, MimeTypes.Application.Json)); return Task.FromResult<HttpContent?>(new StringContent(jsonSerializer.Serialize(value), Encoding.UTF8, MimeTypes.Application.Json));
} }
protected virtual async Task<HttpContent> GenerateFormPostDataAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments) protected virtual async Task<HttpContent?> GenerateFormPostDataAsync(ActionApiDescriptionModel action, IReadOnlyDictionary<string, object> methodArguments)
{ {
var parameters = action var parameters = action
.Parameters .Parameters
@ -108,7 +107,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var formDataContents = await (Task<List<KeyValuePair<string, HttpContent>>>)CallObjectToFormDataAsyncMethod var formDataContents = await (Task<List<KeyValuePair<string, HttpContent>>?>)CallObjectToFormDataAsyncMethod
.MakeGenericMethod(value.GetType()) .MakeGenericMethod(value.GetType())
.Invoke(this, new object[] .Invoke(this, new object[]
{ {
@ -116,7 +115,7 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
action, action,
parameter, parameter,
value value
}); })!;
if (formDataContents != null) if (formDataContents != null)
{ {
@ -158,12 +157,12 @@ public class ClientProxyRequestPayloadBuilder : ITransientDependency
{ {
foreach (var item in (IEnumerable) value) foreach (var item in (IEnumerable) value)
{ {
formData.Add(new StringContent(item.ToString(), Encoding.UTF8), parameter.Name); formData.Add(new StringContent(item.ToString()!, Encoding.UTF8), parameter.Name);
} }
} }
else else
{ {
formData.Add(new StringContent(value.ToString(), Encoding.UTF8), parameter.Name); formData.Add(new StringContent(value.ToString()!, Encoding.UTF8), parameter.Name);
} }
} }

14
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ClientProxyUrlBuilder.cs

@ -100,15 +100,15 @@ public class ClientProxyUrlBuilder : ITransientDependency
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var path = await (Task<string>)CallObjectToPathAsyncMethod var path = await (Task<string?>)CallObjectToPathAsyncMethod
.MakeGenericMethod(value.GetType()) .MakeGenericMethod(value.GetType())
.Invoke(this, new object[] .Invoke(this, new object?[]
{ {
scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.PathConverts[value.GetType()]), scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.PathConverts[value.GetType()]),
action, action,
pathParameter, pathParameter,
value value
}); })!;
if (path != null) if (path != null)
{ {
@ -143,7 +143,7 @@ public class ClientProxyUrlBuilder : ITransientDependency
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var queryString = await (Task<string>)CallObjectToQueryStringAsyncMethod var queryString = await (Task<string?>)CallObjectToQueryStringAsyncMethod
.MakeGenericMethod(value.GetType()) .MakeGenericMethod(value.GetType())
.Invoke(this, new object[] .Invoke(this, new object[]
{ {
@ -151,7 +151,7 @@ public class ClientProxyUrlBuilder : ITransientDependency
action, action,
queryStringParameter, queryStringParameter,
value value
}); })!;
if (queryString != null) if (queryString != null)
{ {
@ -218,11 +218,11 @@ public class ClientProxyUrlBuilder : ITransientDependency
return true; return true;
} }
protected virtual Task<string> ConvertValueToStringAsync([CanBeNull] object value) protected virtual Task<string?> ConvertValueToStringAsync(object? value)
{ {
if (value is DateTime dateTimeValue) if (value is DateTime dateTimeValue)
{ {
return Task.FromResult(dateTimeValue.ToUniversalTime().ToString("O")); return Task.FromResult(dateTimeValue.ToUniversalTime().ToString("O"))!;
} }
return Task.FromResult(value?.ToString()); return Task.FromResult(value?.ToString());

6
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/CurrentApiVersionInfo.cs

@ -6,11 +6,11 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public class CurrentApiVersionInfo : ICurrentApiVersionInfo, ISingletonDependency public class CurrentApiVersionInfo : ICurrentApiVersionInfo, ISingletonDependency
{ {
public ApiVersionInfo ApiVersionInfo => _currentApiVersionInfo.Value; public ApiVersionInfo? ApiVersionInfo => _currentApiVersionInfo.Value;
private readonly AsyncLocal<ApiVersionInfo> _currentApiVersionInfo = new AsyncLocal<ApiVersionInfo>(); private readonly AsyncLocal<ApiVersionInfo?> _currentApiVersionInfo = new AsyncLocal<ApiVersionInfo?>();
public virtual IDisposable Change(ApiVersionInfo apiVersionInfo) public virtual IDisposable Change(ApiVersionInfo? apiVersionInfo)
{ {
var parent = ApiVersionInfo; var parent = ApiVersionInfo;
_currentApiVersionInfo.Value = apiVersionInfo; _currentApiVersionInfo.Value = apiVersionInfo;

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/IClientProxyApiDescriptionFinder.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public interface IClientProxyApiDescriptionFinder public interface IClientProxyApiDescriptionFinder
{ {
ActionApiDescriptionModel FindAction(string methodName); ActionApiDescriptionModel? FindAction(string methodName);
ApplicationApiDescriptionModel GetApiDescription(); ApplicationApiDescriptionModel GetApiDescription();
} }

4
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/ClientProxying/ICurrentApiVersionInfo.cs

@ -4,7 +4,7 @@ namespace Volo.Abp.Http.Client.ClientProxying;
public interface ICurrentApiVersionInfo public interface ICurrentApiVersionInfo
{ {
ApiVersionInfo ApiVersionInfo { get; } ApiVersionInfo? ApiVersionInfo { get; }
IDisposable Change(ApiVersionInfo apiVersionInfo); IDisposable Change(ApiVersionInfo? apiVersionInfo);
} }

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionFinder.cs

@ -118,7 +118,7 @@ public class ApiDescriptionFinder : IApiDescriptionFinder, ITransientDependency
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApplicationApiDescriptionModel>(content, DeserializeOptions); var result = JsonSerializer.Deserialize<ApplicationApiDescriptionModel>(content, DeserializeOptions)!;
return result; return result;
} }

4
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs

@ -66,7 +66,7 @@ public class DynamicHttpProxyInterceptor<TService> : AbpInterceptor, ITransientD
var returnType = invocation.Method.ReturnType.GenericTypeArguments[0]; var returnType = invocation.Method.ReturnType.GenericTypeArguments[0];
var result = (Task)CallRequestAsyncMethod var result = (Task)CallRequestAsyncMethod
.MakeGenericMethod(returnType) .MakeGenericMethod(returnType)
.Invoke(this, new object[] { context }); .Invoke(this, new object[] { context })!;
invocation.ReturnValue = await GetResultAsync(result, returnType); invocation.ReturnValue = await GetResultAsync(result, returnType);
} }
@ -99,6 +99,6 @@ public class DynamicHttpProxyInterceptor<TService> : AbpInterceptor, ITransientD
.MakeGenericType(resultType) .MakeGenericType(resultType)
.GetProperty(nameof(Task<object>.Result), BindingFlags.Instance | BindingFlags.Public); .GetProperty(nameof(Task<object>.Result), BindingFlags.Instance | BindingFlags.Public);
Check.NotNull(resultProperty, nameof(resultProperty)); Check.NotNull(resultProperty, nameof(resultProperty));
return resultProperty.GetValue(task); return resultProperty!.GetValue(task)!;
} }
} }

2
framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/Proxying/HttpActionParameterHelper.cs

@ -6,7 +6,7 @@ namespace Volo.Abp.Http.Client.Proxying;
internal static class HttpActionParameterHelper internal static class HttpActionParameterHelper
{ {
public static object FindParameterValue(IReadOnlyDictionary<string, object> methodArguments, ParameterApiDescriptionModel apiParameter) public static object? FindParameterValue(IReadOnlyDictionary<string, object> methodArguments, ParameterApiDescriptionModel apiParameter)
{ {
var value = methodArguments.GetOrDefault(apiParameter.NameOnMethod); var value = methodArguments.GetOrDefault(apiParameter.NameOnMethod);
if (value == null) if (value == null)

Loading…
Cancel
Save