【问题标题】:Inject Service Reference into .NET with AppSettings.json and Startup.cs使用 AppSettings.json 和 Startup.cs 将服务引用注入 .NET
【发布时间】:2020-04-29 01:00:28
【问题描述】:

我的项目在运行时没有找到服务引用端点。我相信这是由于我的 Startup.cs 中的注入不正确。我是 appsettings.json 和 Startup.cs 配置方法的新手,但已成功在 Startup.cs 中确定了我的类库和 Dbcontext 的范围。

注意,如果有所作为,这个 VS 解决方案包含一个类库和一个 .NET/angular2 Web 项目。对 Service 的调用是从 Angular 网站发起到 Web API 的,Web API 调用发生实际处理的类库上的方法。

服务引用“Cyber​​sourceTrxnProcessor”显示在我的类库项目中(见图),并且 ITransactionProcessor 已公开且可访问(即代码提示工作完美)。 Web 项目在解决方案资源管理器中没有服务引用。

当我添加参考时,这些部分被添加到 app.config 文件(见下文),我将它们复制到 web 项目中的 web.config。

如何在 appsettings 和 Startup 中“重新创建”web.config 设置?

在尝试处理测试付款时,这行代码会引发异常:

TransactionProcessorClient proc = new TransactionProcessorClient("ITransactionProcessor");

我也尝试过手动定义端点,但结果相同:

 System.ServiceModel.EndpointAddress theendpoint =  new System.ServiceModel.EndpointAddress("https://ics2wstesta.ic3.com/commerce/1.x/transactionProcessor");
 TransactionProcessorClient proc = new TransactionProcessorClient("ITransactionProcessor", theendpoint);

这是错误:

尝试处理您的付款时出现异常。请再试一次。在 ServiceModel 客户端配置部分中找不到名为“ITransactionProcessor”和合同“Cyber​​sourceTrxnProcessor.ITransactionProcessor”的端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为在客户端元素中找不到与此名称匹配的端点元素。

这是我在 Visual Studio 中将服务引用添加到项目时生成的配置文件(也与旧 MVC 项目中的内容相匹配):

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
          <binding name="ITransactionProcessor">
             <security mode="TransportWithMessageCredential" />
           </binding>
           <binding name="ITransactionProcessor1" />
      </basicHttpBinding>
   </bindings>
   <client>
         <endpoint address="https://ics2wstesta.ic3.com/commerce/1.x/transactionProcessor" binding="basicHttpBinding" bindingConfiguration="ITransactionProcessor"
    contract="CybersourceTrxnProcessor.ITransactionProcessor" name="portXML" />
   </client>
</system.serviceModel>

这是 appsettings.json:

"ITransactionProcessor": {
    "security": { "mode": "TransportWithMessageCredential" },
    "client": {
         "endpoint": {
             "address": "https://ics2wstesta.ic3.com/commerce/1.x/transactionProcessor",
             "binding": "basicHttpBinding",
             "bindingConfiguration": "ITransactionProcessor",
             "contract": "CybersourceTrxnProcessor.ITransactionProcessor",
             "name": "portXML"
          }
    }
}

这就是我在 Startup.cs 中的内容(还需要按照 Cyber​​source 文档的规定将安全模式设置为 TransportWithMessageCredential):

services.AddScoped<ITransactionProcessor>(provider => {
            var client = new TransactionProcessorClient();               
            client.Endpoint.Address = new EndpointAddress(Configuration["ITransactionProcessor:client:endpoint:address"]);
            client.Endpoint.Contract = new System.ServiceModel.Description.ContractDescription(Configuration["ITransactionProcessor:client:endpoint:contract"]);
            client.Endpoint.Binding = new System.ServiceModel.BasicHttpBinding();
            client.Endpoint.Name = "portXML";   
            return client;
        });

【问题讨论】:

    标签: c# .net dependencies code-injection


    【解决方案1】:

    仅供参考,我终于想通了。我所拥有的一切都是正确的,除了一件小事(它不是几乎总是归结为简单的东西)。该错误实际上告诉我它需要什么。我只需要像这样更改我的 appsettings.json:

    "name": "portXML"
    

    到

    "name": "ITransactionProcessor"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2022-11-22
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 2023-04-05
      相关资源
      最近更新 更多