使用 AppSettings.json 和 Startup.cs 将服务引用注入 .NET

Inject Service Reference into .NET with AppSettings.json and Startup.cs

我的项目在运行时找不到服务引用端点。我认为这是由于我的 Startup.cs 中的注入不正确造成的。我是 appsettings.json 和 Startup.cs 配置方法的新手,但已成功限定我的 class 库和 Startup.cs 中的 Dbcontext。

注意,如果有所不同, 这个 VS 解决方案包含一个 class 库和一个 .NET/angular2 网络项目。对服务的调用从 angular 网站启动到 Web API,Web API 调用发生实际处理的 class 库中的方法。

服务引用 "CybersourceTrxnProcessor" 出现在我的 class 库项目中(参见图片),并且 ITransactionProcessor 已公开并可访问(即代码提示完美运行)。 Web 项目在解决方案资源管理器中没有服务引用。

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

如何 'recreate' 应用程序设置和启动中的 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' 和合同为 'CybersourceTrxnProcessor.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;
        });

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

"name": "portXML"

"name": "ITransactionProcessor"