EHe*_*ine 6 .net c# dependencies code-injection
我的项目在运行时找不到服务引用端点。我相信这是由于我的 Startup.cs 中的注入不正确。我是 appsettings.json 和 Startup.cs 配置方法的新手,但已经成功地在 Startup.cs 中确定了我的类库和 Dbcontext 的范围。
请注意,如果有所不同, 此 VS 解决方案包含一个类库和一个 .NET/angular2 Web 项目。对服务的调用是从 angular 网站向 Web API 发起的,后者调用实际处理发生的类库上的方法。
服务引用“CybersourceTrxnProcessor”出现在我的类库项目中(参见图片),并且 ITransactionProcessor 已公开并可访问(即代码提示工作完美)。Web 项目在解决方案资源管理器中没有服务引用。
当我添加引用时,这些部分被添加到 app.config 文件(见下文),我将它们复制到 web 项目中的 web.config。
如何在 appsettings 和 Startup 中“重新创建”web.config 设置?
尝试处理测试付款时,这行代码抛出异常:
TransactionProcessorClient proc = new TransactionProcessorClient("ITransactionProcessor");
Run Code Online (Sandbox Code Playgroud)
我也试过在之前手动定义端点,但同样的错误结果:
System.ServiceModel.EndpointAddress theendpoint = new System.ServiceModel.EndpointAddress("https://ics2wstesta.ic3.com/commerce/1.x/transactionProcessor");
TransactionProcessorClient proc = new TransactionProcessorClient("ITransactionProcessor", theendpoint);
Run Code Online (Sandbox Code Playgroud)
这是错误:
尝试处理您的付款时发生异常。请再试一次。在 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>
Run Code Online (Sandbox Code Playgroud)
这是 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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在 Startup.cs 中的内容(还需要按照 Cybersource 文档的规定将安全模式设置为 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;
});
Run Code Online (Sandbox Code Playgroud)
仅供参考,我终于明白了这一点。我所拥有的一切都是正确的,除了一件小事(它不是几乎总是归结为简单的事情)。这个错误实际上准确地告诉了我它需要什么。我只需要像这样更改我的 appsettings.json :
"name": "portXML"
Run Code Online (Sandbox Code Playgroud)
到
"name": "ITransactionProcessor"
Run Code Online (Sandbox Code Playgroud)