【发布时间】:2026-02-10 08:30:01
【问题描述】:
我有一个 ASP .Net Core 2.2 Web API。在其中,我有一个端点,前端(Angular 应用程序)可以将文件发送到 API,然后 API 会将此文件上传到 Amazon S3 存储桶(us-east-1 区域)。
这在我在 Visual Studio 中调试时完美运行,但是当我发布到我的服务器 (Windows Server 2016) 时,我得到以下异常:
错误:异常已被一个目标抛出 调用。 在 System.RuntimeMethodHandle.InvokeMethod(Object 目标,Object[] 参数,签名 sig,布尔构造函数, 布尔 wrapExceptions) 在 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化)
在 Amazon.Extensions.NETCore.Setup.ClientFactory.CreateClient(类型 serviceInterfaceType、AWSCredentials 凭证、ClientConfig 配置) 在 Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient(ILogger logger,类型 serviceInterfaceType,AWSOptions 选项)在 Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient(IServiceProvider 提供者)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite、ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument 参数)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite,ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSite(IServiceCallSite callSite, TArgument 参数)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.c__DisplayClass1_0。 b__0(ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(类型 serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
在 lambda_method(Closure, IServiceProvider, Object[]) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__DisplayClass4_0。 b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c__DisplayClass5_0。 g__CreateController|0(ControllerContext 控制器上下文)在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态& next, Scope& 范围, Object& 状态, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext 上下文)在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(状态和下一个, 范围&作用域、对象&状态、布尔& isCompleted)在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync() 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
在 Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在 PropWorx.API.Middlewares.TenantIdentifier.Invoke(HttpContext httpContext, SharedContext sharedContext) 中 C:\Users\fabsr\source\repos\PropWorx.API\PropWorx.API\Middlewares\TenantIdentifier.cs:line 73 在 Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.Builder.Extensions.MapWhenMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext 上下文)在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext 上下文)
我在 %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
}
只要我在此控制器中调用任何操作,就会发生错误。事实上,错误似乎是在将 S3Service 注入控制器的构造函数时发生的。如果我删除构造函数注入,即:
public class FilesController : ControllerBase
{
private readonly IS3Service _s3Service;
public FilesController()
{
}
// Some actions to receive the file... not important
}
错误消失(但当然不能正常工作)
有什么想法吗?就像我说的,这在我的笔记本电脑上完美运行,同时在 VS2017 中进行调试。但是发布到服务器时它不起作用。 API 中的所有其他控制器都可以正常工作。在构造函数中注入 S3Service 时似乎有问题...
【问题讨论】:
-
我在使用 S3 存储桶时遇到了同样的问题。如果我使用 DI 注入 IAmazonS3,它没有选择配置值,因此无法解析对象。我在没有 DI 的情况下使用它,它能够工作。
标签: asp.net-core aws-sdk asp.net-core-webapi