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

时间:2017-06-09 15:55:17

标签: c# .net dependencies code-injection

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

注意,如果它有所不同, 此VS解决方案包含一个类库和一个.NET / angular2 Web项目。对服务的调用是从angular网站启动到Web API,后者调用类库中进行实际处理的方法。

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

enter image description here

当我添加引用时,这些部分被添加到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);

这是错误:

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

这是配置文件的样子,当我在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 docs的规定将安全模式设置为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;
        });

1 个答案:

答案 0 :(得分:0)

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

"name": "portXML"

"name": "ITransactionProcessor"