Created Abp.Http.Client package.

pull/96/head
Halil İbrahim Kalkan 8 years ago
parent b7adb82418
commit 849eed0b54

@ -128,9 +128,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.MemoryDb.Tests", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.TestApp.Tests", "test\Volo.Abp.TestApp.Tests\Volo.Abp.TestApp.Tests.csproj", "{4C2F7B03-C598-4432-A43A-B065D9D0712F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http", "src\Volo.Abp.Http\Volo.Abp.Http.csproj", "{01A70034-D353-4BF9-821D-F2B6F7641532}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Http", "src\Volo.Abp.Http\Volo.Abp.Http.csproj", "{01A70034-D353-4BF9-821D-F2B6F7641532}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Tests", "test\Volo.Abp.Http.Tests\Volo.Abp.Http.Tests.csproj", "{5B86E837-0C89-4058-A84B-0B51F2F573D4}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Http.Client", "src\Volo.Abp.Http.Client\Volo.Abp.Http.Client.csproj", "{D5E2FB37-0194-480A-B952-5FFECC1200EB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Http.Client.Tests", "test\Volo.Abp.Http.Client.Tests\Volo.Abp.Http.Client.Tests.csproj", "{703BD43C-02B9-413F-854C-9CBA0C963196}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -326,10 +328,14 @@ Global
{01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|Any CPU.Build.0 = Debug|Any CPU
{01A70034-D353-4BF9-821D-F2B6F7641532}.Release|Any CPU.ActiveCfg = Release|Any CPU
{01A70034-D353-4BF9-821D-F2B6F7641532}.Release|Any CPU.Build.0 = Release|Any CPU
{5B86E837-0C89-4058-A84B-0B51F2F573D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B86E837-0C89-4058-A84B-0B51F2F573D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B86E837-0C89-4058-A84B-0B51F2F573D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B86E837-0C89-4058-A84B-0B51F2F573D4}.Release|Any CPU.Build.0 = Release|Any CPU
{D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|Any CPU.Build.0 = Release|Any CPU
{703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|Any CPU.Build.0 = Debug|Any CPU
{703BD43C-02B9-413F-854C-9CBA0C963196}.Release|Any CPU.ActiveCfg = Release|Any CPU
{703BD43C-02B9-413F-854C-9CBA0C963196}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -391,7 +397,8 @@ Global
{D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8} = {37087D1B-3693-4E96-983D-A69F210BDE53}
{4C2F7B03-C598-4432-A43A-B065D9D0712F} = {37087D1B-3693-4E96-983D-A69F210BDE53}
{01A70034-D353-4BF9-821D-F2B6F7641532} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8}
{5B86E837-0C89-4058-A84B-0B51F2F573D4} = {37087D1B-3693-4E96-983D-A69F210BDE53}
{D5E2FB37-0194-480A-B952-5FFECC1200EB} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8}
{703BD43C-02B9-413F-854C-9CBA0C963196} = {37087D1B-3693-4E96-983D-A69F210BDE53}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

@ -13,7 +13,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.AspNetCore\Volo.Abp.AspNetCore.csproj" />
<ProjectReference Include="..\Volo.Abp.Http\Volo.Abp.Http.csproj" />
<ProjectReference Include="..\Volo.Abp.Http.Client\Volo.Abp.Http.Client.csproj" />
</ItemGroup>
<ItemGroup>

@ -1,10 +1,10 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Http;
using Volo.Abp.Http.Client;
using Volo.Abp.Modularity;
namespace Volo.Abp.AspNetCore.TestBase
{
[DependsOn(typeof(AbpHttpModule))]
[DependsOn(typeof(AbpHttpClientModule))]
[DependsOn(typeof(AbpAspNetCoreModule))]
public class AbpAspNetCoreTestBaseModule : AbpModule
{

@ -1,6 +1,6 @@
using System.Net.Http;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.DynamicProxying;
using Volo.Abp.Http.Client.DynamicProxying;
namespace Volo.Abp.AspNetCore.TestBase.DynamicProxying
{

@ -2,7 +2,8 @@
using Castle.DynamicProxy;
using Volo.Abp.Castle.DynamicProxy;
using Volo.Abp.Http;
using Volo.Abp.Http.DynamicProxying;
using Volo.Abp.Http.Client;
using Volo.Abp.Http.Client.DynamicProxying;
namespace Microsoft.Extensions.DependencyInjection
{
@ -19,7 +20,7 @@ namespace Microsoft.Extensions.DependencyInjection
public static IServiceCollection AddHttpClientProxy(this IServiceCollection services, Type type, string baseUrl)
{
services.Configure<AbpHttpOptions>(options =>
services.Configure<AbpHttpClientOptions>(options =>
{
options.HttpClientProxies[type] = new DynamicHttpClientProxyConfig(type, baseUrl);
});

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.Http.Client</AssemblyName>
<PackageId>Volo.Abp.Http.Client</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Castle.Core\Volo.Abp.Castle.Core.csproj" />
<ProjectReference Include="..\Volo.Abp.Http\Volo.Abp.Http.csproj" />
</ItemGroup>
</Project>

@ -1,14 +1,14 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Http.DynamicProxying;
using Volo.Abp.Http.Client.DynamicProxying;
namespace Volo.Abp.Http
namespace Volo.Abp.Http.Client
{
public class AbpHttpOptions
public class AbpHttpClientOptions
{
public Dictionary<Type, DynamicHttpClientProxyConfig> HttpClientProxies { get; set; }
public AbpHttpOptions()
public AbpHttpClientOptions()
{
HttpClientProxies = new Dictionary<Type, DynamicHttpClientProxyConfig>();
}

@ -0,0 +1,14 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.Http.Client
{
[DependsOn(typeof(AbpHttpModule))]
public class AbpHttpClientModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpHttpClientModule>();
}
}
}

@ -7,10 +7,8 @@ using Nito.AsyncEx;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
namespace Volo.Abp.Http.DynamicProxying
namespace Volo.Abp.Http.Client.DynamicProxying
{
//TODO: Move DynamicProxying to Volo.Abp.Http.Client module
public class ApplicationApiDescriptionModelManager : IApplicationApiDescriptionModelManager, ISingletonDependency
{
private readonly IDynamicProxyHttpClientFactory _httpClientFactory;

@ -1,7 +1,7 @@
using System.Net.Http;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Http.DynamicProxying
namespace Volo.Abp.Http.Client.DynamicProxying
{
public class DefaultDynamicProxyHttpClientFactory : IDynamicProxyHttpClientFactory, ITransientDependency
{

@ -1,6 +1,6 @@
using System;
namespace Volo.Abp.Http.DynamicProxying
namespace Volo.Abp.Http.Client.DynamicProxying
{
public class DynamicHttpClientProxyConfig
{

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;
@ -9,9 +7,10 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Http.Modeling;
using Volo.Abp.Threading;
namespace Volo.Abp.Http.DynamicProxying
namespace Volo.Abp.Http.Client.DynamicProxying
{
public class DynamicHttpProxyInterceptor<TService> : AbpInterceptor, ITransientDependency
{
@ -19,7 +18,7 @@ namespace Volo.Abp.Http.DynamicProxying
private readonly IDynamicProxyHttpClientFactory _httpClientFactory;
private readonly IApplicationApiDescriptionModelManager _discoverManager;
private readonly AbpHttpOptions _options;
private readonly AbpHttpClientOptions _options;
static DynamicHttpProxyInterceptor()
{
@ -29,8 +28,8 @@ namespace Volo.Abp.Http.DynamicProxying
}
public DynamicHttpProxyInterceptor(
IDynamicProxyHttpClientFactory httpClientFactory,
IOptions<AbpHttpOptions> options,
IDynamicProxyHttpClientFactory httpClientFactory,
IOptions<AbpHttpClientOptions> options,
IApplicationApiDescriptionModelManager discoverManager)
{
_httpClientFactory = httpClientFactory;
@ -47,7 +46,7 @@ namespace Volo.Abp.Http.DynamicProxying
{
invocation.ReturnValue = GenericInterceptAsyncMethod
.MakeGenericMethod(invocation.Method.ReturnType.GenericTypeArguments[0])
.Invoke(this, new object[]{ invocation });
.Invoke(this, new object[] { invocation });
return Task.CompletedTask;
}
@ -62,10 +61,11 @@ namespace Volo.Abp.Http.DynamicProxying
var apiDescriptionModel = await _discoverManager.GetAsync(config.BaseUrl);
var action = FindAction(apiDescriptionModel, invocation.Method);
using (var client = _httpClientFactory.Create())
{
var response = await client.GetAsync("/api/app/people");
var response = await client.GetAsync(config.BaseUrl + action.Url);
if (!response.IsSuccessStatusCode)
{
throw new AbpException("Remote service returns error!");
@ -84,5 +84,44 @@ namespace Volo.Abp.Http.DynamicProxying
return (T)result;
}
}
private ActionApiDescriptionModel FindAction(ApplicationApiDescriptionModel apiDescriptionModel, MethodInfo method)
{
var methodParameters = method.GetParameters().ToArray();
foreach (var module in apiDescriptionModel.Modules.Values)
{
//TODO: Check module type too
foreach (var controller in module.Controllers.Values)
{
//TODO: Check controller type too
foreach (var action in controller.Actions.Values)
{
if (action.NameOnClass == method.Name && action.Parameters.Count == methodParameters.Length)
{
var found = true;
for (int i = 0; i < methodParameters.Length; i++)
{
if (action.Parameters[i].TypeAsString != methodParameters[i].ParameterType.FullName)
{
found = false;
break;
}
}
if (found)
{
return action;
}
}
}
}
}
throw new AbpException("Could not found remote action for method: " + method);
}
}
}

@ -2,7 +2,7 @@
using System.Threading.Tasks;
using Volo.Abp.Http.Modeling;
namespace Volo.Abp.Http.DynamicProxying
namespace Volo.Abp.Http.Client.DynamicProxying
{
public interface IApplicationApiDescriptionModelManager
{

@ -1,6 +1,6 @@
using System.Net.Http;
namespace Volo.Abp.Http.DynamicProxying
namespace Volo.Abp.Http.Client.DynamicProxying
{
public interface IDynamicProxyHttpClientFactory
{

@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>Volo.Abp.Http.Tests</AssemblyName>
<PackageId>Volo.Abp.Http.Tests</PackageId>
<PackageId>Volo.Abp.Http.Client.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
@ -12,7 +12,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Http\Volo.Abp.Http.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Http.Client\Volo.Abp.Http.Client.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\Volo.Abp.AspNetCore.Mvc.Tests\Volo.Abp.AspNetCore.Mvc.Tests.csproj" />
</ItemGroup>

@ -1,13 +1,12 @@
using Castle.DynamicProxy;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.App;
using Volo.Abp.Castle.DynamicProxy;
using Volo.Abp.Http.Client;
using Volo.Abp.Modularity;
using Volo.Abp.TestApp.Application;
namespace Volo.Abp.Http
{
[DependsOn(typeof(AbpAspNetCoreMvcTestModule), typeof(AbpHttpModule))]
[DependsOn(typeof(AbpAspNetCoreMvcTestModule), typeof(AbpHttpClientModule))]
public class AbpHttpTestModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
Loading…
Cancel
Save