在.NET Core中消费WCF服务,应该使用services.AddSingleton还是services.AddTransient?

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

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

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

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

我不确定应该使用哪个,services.AddSingleton还是services.AddTransient,因为我不确定代理类用什么来调用方法。
如果我创建一个单一实例,它会被锁定吗?
我已经使用1000行数据库和1000行csv作为参数进行了Jmeter测试,以消费API,但没有发现任何锁定,并且所有操作都在3分钟内成功。

@DingPeng 我对WCF客户端的工作原理不太确定,我了解到它是线程安全的,所以一个单一实例足以处理所有请求。我不确定DNS缓存以及在WCF服务暂时不可用(仅一秒钟)的情况下是否会重试等。 - undefined
services.AddSingleton<IService1, Service1Client>();在我这里一直都有效。而且还观察到,如果服务端出现问题并得到解决,它会开始正常工作,而无需重新生成池。 - undefined
2个回答

1

根据这份Web API文档,应该实例化一个单一的HttpClient: https://learn.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client#create-and-initialize-httpclient

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

在您的情况下,生成的客户端应该在其内部使用一个HttpClient。如果您可以确定整个生成的客户端是线程安全的,则可以将客户端注入为Singleton;否则,您应该将其添加为Scoped。


你能提供一些支持这个说法的参考资料吗?生成的客户端应该在内部使用一个 HttpClient - undefined
不是真的,我只是根据https绑定来假设的,你应该检查生成的客户端代码,以及它的线程安全性,这实际上是关键。无论底层技术如何,你将其注入为作用域或单例的决定取决于客户端的线程安全性。 - undefined

1
你可以查看 servicereference.cs 文件,以查看代理类调用了 WCF 服务中的哪个方法。

enter image description here

然后,我们需要实例化代理类并通过实例化的代理类调用WCF服务:
ServiceReference.Service1Client service1 = new Service1Client();

enter image description here


感谢您的支持。我知道我可以从service1对象中调用方法。我的问题是,您是如何将这个类注入到您的核心API中的? - undefined
你可以参考这个链接,其中包含了如何在WCF中使用依赖注入的内容:https://stackoverflow.com/questions/61723357/can-we-use-simple-injector-for-dependency-injection-in-wcf-services-and-how/61810429#61810429 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接