Ошибка «Исключение было вызвано целью вызова» при добавлении службы Amazon S3 в конструктор ASP .Net Core - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть ASP .Net Core 2.2 Web API.В нем есть конечная точка, в которой интерфейс (приложение Angular) может отправлять файл в API, а API, в свою очередь, загружает этот файл в корзину Amazon S3 (регион us-east-1).

Это прекрасно работает во время отладки в Visual Studio, но при публикации на моем сервере (Windows Server 2016) я получаю следующее исключение:

Ошибка: возникло исключениепо цели вызова. в System.RuntimeMethodHandle.InvokeMethod (Object target, Object [] arguments, сигнатура сигнатуры, логический конструктор, Boolean wrapExceptions) в System.Reflection.RuntimeConstructorInfo.Invoke (BindingFlags invokeAttr, Binder, Binder[] параметры, культура CultureInfo)
в Amazon.Extensions.NETCore.Setup.ClientFactory.CreateClient (тип serviceInterfaceType, учетные данные AWSCredentials, конфигурация ClientConfig) в Amazon.Extensions.NETCore.Setup.ClientFactory.CreateSogineTyntInterInterInserviceClient, Опции AWSOptions) на Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient (поставщик IServiceProvider) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory (сфера FactoryCallSite factoryCallSite, аргумент ServiceProviderEngineScope * 2.SiteCressSenseSignSpenSec.) в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor (ConstructorCallSite constructorCallSite, ServiceProviderEngineScope) в Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine. <> c__DisplayClass1_0.b__0 (область действия ServiceProviderEngineScope) в Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService (тип serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
в Microsoft.Extensions.DependencyInjection.epenServiceServiceServiceServiceActivatorUtilities.GetService (IServiceProvider sp, тип Type, Type requiredBy, логическое значение isDefaultParameterRequired)
в lambda_method (закрытие, IServiceProvider, Object []) в Microsoft.AspNetCore.Mvc.Controllers.ControllerAclassator_ider.ider0.b__0 (ControllerContext controllerContext) в Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider. <> c__DisplayClass5_0.g__CreateController | 0 (ControllerContext controllerContext) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (Состояние и следующее, Область и область действия, Объект и состояние, Логическое значение и isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ControlilAinInInCoreInInInInIn..Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResourceExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (область видимости и следующего объекта, область видимости и объекта, область видимости и состояния, область видимости и объекта, область видимости и состояния, область видимости и состояния объекта)) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
в Microsoft.AspNetCore.Routing.EndpointMiddleware.InteCateContext ().Routing.EndpointRoutingMiddleware.Invoke (HttpContext httpContext) в PropWorx.API.Middlewares.TenantIdentifier.Invoke (HttpContext httpContext, SharedContext sharedConte)xt) в C: \ Users \ fabsr \ source \ repos \ PropWorx.API \ PropWorx.API \ Middlewares \ TenantIdentifier.cs: строка 73 в Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke (HttpContext)контекста) в Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (контекст HttpContext) в Swashbuckle.AspNetCore.SwaggerPackTeteTecteke.teke ().Swagger.SwaggerMiddleware.Invoke (HttpContext httpContext, ISwaggerProvider swaggerProvider) в Microsoft.AspNetCore.Authentication.Я создал файл «credentials» в папке% UserProfile% .aws.

Я добавил в проект следующие два пакета NuGet:

  • AWSSDK.Extensions.NETCore.Setup
  • AWSSDK.S3

У меня есть это в моем Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAWSService<IAmazonS3>();
    services.AddSingleton<IS3Service, S3Service>();
}

S3Service.cs выглядит так:

public class S3Service : IS3Service
{
    private readonly IAmazonS3 _client;

    public S3Service(IAmazonS3 client)
    {
        _client = client;
    }

    // Some methods to upload and delete objects... not important
}

Я внедряю эту услугу на один из моих контроллеров:

public class FilesController : ControllerBase
{
    private readonly IS3Service _s3Service;

    public FilesController(IS3Service s3Service)
    {
        _s3Service = s3Service;
    }

    // Some actions to receive the file... not important
}

Ошибка hпоявляется как только я вызываю какие-либо действия в этом контроллереФактически, ошибка, кажется, происходит, когда S3Service вводится в конструктор контроллера.Если я удаляю инъекцию конструктора, то есть:

public class FilesController : ControllerBase
{
    private readonly IS3Service _s3Service;

    public FilesController()
    {
    }

    // Some actions to receive the file... not important
}

Ошибка исчезает (но, конечно, не работает должным образом)

Есть идеи?Как я уже сказал, это отлично работает на моем ноутбуке при отладке в VS2017.Но это не работает при публикации на сервер.Все остальные контроллеры в API работают нормально.Кажется, это проблема в момент внедрения S3Service в конструктор ...

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я держал это просто.На моих локальных компьютерах я хранил ключи в секретах пользователя, а на prod-сервере - в файле конфигурации IIS.и только что получил доступ к этим значениям из ConfigurationManager.В основном это был новый синтаксис AmazonS3Client (строка, строка, строка).Также я использовал гораздо более старую версию ядра .net, возможно, проблема была решена.Проверьте это , которое, кажется, работает.

0 голосов
/ 13 февраля 2019

Я изменил свой код, чтобы получить страховку IAmazonS3 не через, а непосредственно создав его экземпляр в моем методе IS3Serice, и это сработало.Каким-то образом DI не может выбрать значения конфигурации, и поэтому не смог разрешить объект.

Вы можете получить некоторую информацию об этом от здесь

Я пошелв действующей документации https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html

и найдено следующее:

Если вы посмотрите на вкладку «Отладка» в свойствах вашего проекта, вы увидите, что для этого файла установлено значение «Разработка».,Это прекрасно работает для локального тестирования, потому что вы можете поместить свою конфигурацию в файл appsettings.Development.json, который доступен только для чтения во время локального тестирования.При развертывании экземпляра Amazon EC2, для которого EnvironmentName задано значение Production, этот файл игнорируется, и в AWS SDK для .NET используются учетные данные и регион IAM, настроенные для экземпляра Amazon EC2.

Итакэто может быть причиной того, что ваши начальные конфигурации не работали, так как вы пытались использовать ключи доступа на производстве.

Также взгляните на следующий ответ

Как установить учетные данныена AWS SDK на NET Core?

...