【问题标题】:Consume wcf service in .net core which to use services.AddSingleton or services.AddTransient在 .net 核心中使用 wcf 服务来使用 services.AddSingleton 或 services.AddTransient
【发布时间】:2021-02-09 10:16:52
【问题描述】:

我在 .net core API 项目中使用 WCF 服务,我使用了以下步骤:
WCF服务中的绑定(测试用)<add binding="basicHttpsBinding" scheme="https" />

  1. 使用https://docs.microsoft.com/en-us/dotnet/core/additional-tools/dotnet-svcutil-guide?tabs=dotnetsvcutil2x 创建了一个代理类
    (这创建了一个具有接口IService1 并调用Service1Client 的代理。

  2. 在启动类中我已经将接口与services.AddSingleton<IService1, Service1Client>();类绑定了

WCF服务中的方法端点根据传递给WCF服务的参数从数据库中获取数据。

我不确定应该使用哪一个,services.AddSingletonservices.AddTransient,因为我不确定代理类使用什么来调用该方法。

如果我创建一个实例,它会被锁定吗?

我做了一个Jmeter test,数据库中有1000行,csv中有1000行作为参数来使用API​​,但没有找到任何锁,并且在3分钟内全部成功。

【问题讨论】:

  • @DingPeng 我不确定 WCF 客户端是否工作我知道它是线程安全的,所以单个实例足以处理所有请求。我不确定 DNS 兑现,如果 WCF 服务不可用(一秒钟),它会重试等。
  • services.AddSingleton<IService1, Service1Client>(); 为我工作了很久。并观察解决后服务端是否存在问题。它在没有回收池的情况下开始工作。

标签: wcf .net-core dependency-injection asp.net-core-webapi


【解决方案1】:

通过 web api 中的此文档,应实例化单个 httpclient: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client#create-and-initialize-httpclient

当然,如果您有多个目标服务,具有不同的端点,则每个服务都需要一个 HttpClient(您在 HttpClient 中设置基地址)

在您的情况下,您生成的客户端应该在幕后使用 HttpClient。如果您可以确定整个生成的客户端是否是线程安全的,那么您可以将客户端作为单例注入,如果不是,您应该将其添加为作用域

【讨论】:

  • 您能否提供一些参考来支持此声明生成的客户端应在幕后使用 HttpClient
  • 不是真的,我猜是因为 https 绑定,你应该检查生成的客户端的代码,以及它的线程安全,这实际上是重点。关于底层技术,你决定注入是作用域还是单例取决于客户端的线程安全
【解决方案2】:

可以查看servicereference.cs文件,看wcf服务中哪个方法被代理类调用。

那么我们需要实例化代理类,通过实例化的代理类调用WCF服务:

ServiceReference.Service1Client service1 = new Service1Client();

【讨论】:

  • 感谢您的支持。我知道我可以从 service1 对象调用方法。你如何将这个类注入你的核心 api 是我的问题。
  • 可以参考这个链接,里面包含了如何在WCF中使用依赖注入:stackoverflow.com/questions/61723357/…
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
相关资源
最近更新 更多