首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序引发一个未处理的异常。System.ArgumentNullException:值不能为空。(参数'uriString')

应用程序引发一个未处理的异常。System.ArgumentNullException:值不能为空。(参数'uriString')
EN

Stack Overflow用户
提问于 2021-11-29 06:42:03
回答 2查看 3K关注 0票数 1

我是一个asp .net核心6.0WebAPI项目。

问题概述:

我面临一个问题。在运行项目时,get请求的响应是200 ok。但是在构建项目时,get请求显示了500Internal Server Error ,而在终端中,我也得到了错误.

详细信息:

当我使用dotnet run (宿主环境:开发,端口为7045或5032)和https://localhost:7045/api/public/opayo-payment/retrieve-transaction/9A5CAE22-7109-D006-A017-41BF9F138076运行该项目时,get请求的响应是200

但是当我使用dotnet publish -c Releasedotnet /home/PaymentApi.dll (宿主环境: project,端口为5000或5001)构建项目时

https://localhost:5001/api/public/opayo-payment/retrieve-transaction/9A5CAE22-7109-D006-A017-41BF9F138076这个get请求的响应是500Internal Server Error

在终端机上,我得到了以下错误

代码语言:javascript
复制
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HMDJ000A9MDB", Request id "0HMDJ000A9MDB:00000002": An unhandled exception was thrown by the application.
      System.ArgumentNullException: Value cannot be null. (Parameter 'uriString')
         at System.Uri..ctor(String uriString)
         at Program.<>c__DisplayClass0_0.<<Main>$>b__1(HttpClient c) in /home/PaymentApi/Program.cs:line 16
         at Microsoft.Extensions.Http.DefaultHttpClientFactory.CreateClient(String name)
         at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.AddTransientHelper[TClient,TImplementation](IServiceProvider s, IHttpClientBuilder builder)
         at Microsoft.Extensions.DependencyInjection.HttpClientBuilderExtensions.<>c__DisplayClass13_0`2.<AddTypedClientCore>b__0(IServiceProvider s)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass2_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
         at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
         at lambda_method9(Closure , IServiceProvider , Object[] )
         at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass7_0.<CreateActivator>b__0(ControllerContext controllerContext)
         at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
      --- End of stack trace from previous location ---
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
         at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
         at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

在program.cs中

代码语言:javascript
复制
builder.Services.Configure<MerchantSessionConfig>(builder.Configuration.GetSection("Payments:TestOpayo"));
builder.Services.AddHttpClient<IOpayoPaymentService, OpayoPaymentService>("PublicOpayoApi", c =>
                c.BaseAddress = new Uri(builder.Configuration.GetValue<string>("Payments:TestOpayo:Url"))
                );

服务

代码语言:javascript
复制
private readonly HttpClient _client;
        private readonly IHttpClientFactory _clientFactory;
        private readonly MerchantSessionConfig _merchantSessionConfigoptions;

        private readonly DataDbContex _dataDbContex;

        public OpayoPaymentService(HttpClient client, IHttpClientFactory clientFactory, 
        IOptions<MerchantSessionConfig> options, DataDbContex dataDbContex)
        {                
            client = clientFactory.CreateClient("PublicOpayoApi");
            _clientFactory = clientFactory;
            _client = client;
            _merchantSessionConfigoptions = options.Value;
            _dataDbContex = dataDbContex;

            // Basic Authentication
            _client.DefaultRequestHeaders.Add("Accept", "application/json");
            var authenticationString = $"{_merchantSessionConfigoptions.Username}:{_merchantSessionConfigoptions.Password}";
            var base64EncodedString = Convert.ToBase64String(System.Text.ASCIIEncoding.UTF8.GetBytes(authenticationString));
            _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64EncodedString);

        }

appsettings.Development.json

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "DefaultConnection": "Server=<server>; port=5432; user id=postgres; password=<password>; database=<db>; Integrated Security=true; Pooling=true; CommandTimeout=300;Include Error Detail=true;Log Parameters=true"
  },
  "Payments": {
    "TestOpayo": {
      "Url": "https://pi-test.sagepay.com",
      "VendorName": "vendor",
      "Username": "username",
      "Password": "password"
    }
  }
}

appsettings.json

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

请任何人帮我找出错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-29 07:44:00

好的,试试:

appsettings.json

代码语言:javascript
复制
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "DefaultConnection": "Server=<server>; port=5432; user id=postgres; password=<password>; database=<db>; Integrated Security=true; Pooling=true; CommandTimeout=300;Include Error Detail=true;Log Parameters=true"
  },
  "Payments": {
    "TestOpayo": {
      "Url": "https://pi-test.sagepay.com",
      "VendorName": "vendor",
      "Username": "username",
      "Password": "password"
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2021-11-29 07:39:44

您正在从应用程序设置中用builder.Configuration.GetValue<string>("Payments:TestOpayo:Url")加载-builder.Configuration.GetValue<string>("Payments:TestOpayo:Url")

因此,您应该已经在生产环境的应用程序设置中配置了参数。

有一个用于将应用程序设置映射到环境(开发、生产)的约定.net 6文档

它看起来像是生产应用程序设置中缺少的Payments:TestOpayo:Url

您还应该使用__作为分隔器,以实现平台不可知论,这是对键:Payments__TestOpayo__Url的利兹

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70150656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档