我们是否应该对 C# 中从 Microsoft.Rest.ServiceClient 派生的客户端使用单例?

2024-03-01

使用从 swagger 规范(例如与 Azure 资源管理器关联的规范)生成的 Azure .NET SDK 时,生成的库利用 Microsoft AutoRest 客户端运行时,并且各种“客户端”均继承自“ServiceClient”。

我们一直在使用 DocumentDB Client,并阅读了大量有关在 .NET 中使用本机 HttpClient 的问题。 Microsoft 建议对这两个客户端使用单例模式,因为它们的内部工作方式,尽管使用单例模式存在众所周知的问题。在这些情况下,这是必要的。

因此,我们针对这些情况制定了使用和管理单例的策略,因此我们想知道是否应该对从 ServiceClient 派生的 Azure REST 客户端使用相同的策略。如果它使用 HttpClient 那就有意义了。

注意:此问题不是寻求有关单例或客户端的一般开发人员建议的问题,而是针对与 AutoRest 客户端运行时相关的 Microsoft 开发团队基于对其内部工作原理的了解的特定问题。


我一直在尝试解决同样的问题。我正在使用许多自动休息服务客户端,但必须在每个请求时重新实例化它们以传递特定于用户的客户端凭据。使用 Microsoft.Rest.ClientRuntime 2.3.6,您现在可以使用自己的 HttpClient 实例化 ServiceClient。这允许我将瞬态 ServiceClient 与单例 HttpClient 一起使用。我只是向生成的自动休息客户端添加了一个新的构造函数。

public partial class MyClient : ServiceClient<IMyClient>, IMyClient
{

    public MyClient(Uri baseUri, ServiceClientCredentials credentials, HttpClient client) : base(client)
    {
        if (baseUri == null)
        {
            throw new ArgumentNullException("baseUri");
        }
        if (credentials == null)
        {
            throw new ArgumentNullException("credentials");
        }

        this.Initialize();
        this.Credentials = credentials;
        Credentials?.InitializeServiceClient(this);
        this.BaseUri = baseUri;

    }
    [...]
}

但是,这会在第一次请求后导致 ObjectDisposeException。这是因为 ServiceClient 会处理 HttpClient,无论您是否传入它。method https://github.com/Azure/azure-sdk-for-net/blob/vs17Dev/src/SdkCommon/ClientRuntime/ClientRuntime/ServiceClient.cs#L372

protected virtual void Dispose(bool disposing)
{
    if (!_disposed)
    {
        _disposed = true;

        // Dispose the client
        HttpClient.Dispose();
        HttpClient = null;
        FirstMessageHandler = null;
        HttpClientHandler = null;
    }
}

我只是重写了“MyClient”中的 Dispose 方法而不执行任何操作,因为唯一被释放的对象是 HttpClient。

protected override void Dispose(bool disposing) { }

我没有注意到这有任何后果,因为 FirstMessageHandler 和 HttpClientHandler 仅在 ServiceClient 为您创建 HttpClient 时才实例化。这种方法允许我在多个 AutoRest 生成的 ServiceClient 中使用单个 HttpClient,并在每个请求上使用自定义用户凭据。

我很想知道是否有人看到这种方法的任何后果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们是否应该对 C# 中从 Microsoft.Rest.ServiceClient 派生的客户端使用单例? 的相关文章

随机推荐

  • 如何防止 CSS 渲染阻止我的网站?

    我正在尝试优化移动网页的加载速度 为此我正在使用该网站 https developers google com speed pagespeed insights https developers google com speed pages
  • 递归替换字典中的字符

    如何更改所有点 下划线 在字典的键中 给定一个任意嵌套的字典 我尝试的是编写两个循环 但随后我将仅限于两级嵌套字典 This brown muffins 5 green pear 4 delicious apples green apple
  • MySQL 可以检查该文件是否存在吗?

    我有一个表 其中保存硬盘上真实文件的相对路径 例如 SELECT FROM images gt id path 1 files 1 jpg 2 files 2 jpg 我可以创建一个查询来选择指向不存在文件的所有记录吗 我需要通过 MySq
  • 如何在 angular2/ionic 2 typescript 应用程序中使用 Numeral.js 库?

    我已经成功地在我的 angularJs 1 x 应用程序中使用 Numeral js 库以不同的格式格式化我的数字 这就是我使用 angular1 过滤器的方式 过滤器 js filter numeral function return f
  • MPI 运行错误“导致所有级别集体中止”

    我正在尝试使用 C 中的 MPI 编写并行程序 但是 当我运行我的程序时 我收到该消息并且我的程序被终止 我不知道该错误消息的原因 警告 无法读取 mpd hosts 或未提供主机列表 MPI 作业将仅在当前计算机上运行 解决方案正在启动
  • 配置文件标记为重复的 Exceptionless 包

    不确定我的项目发生了什么 但是当我尝试运行它时 我收到了错误消息Could not load file or assembly Exceptionless Mvc or one of its dependencies Eceptionles
  • Git:如何分析具有多文件历史记录的代码?

    我即将在现有项目中移动大量文件 在执行此操作之前 我想牢牢掌握一些用于分析具有多文件历史记录的代码的技术 如何使用git来询问 这行代码是从哪里来的 当内容在其生命周期内移动过多个文件时 我知道 git 不会明确地跟踪重命名 有充分的理由
  • 范围交集/并集

    我正在开发一种编程语言 我想为其提供Range数据类型 目前不像通常那样是一个成对的列表int values x y 的约束条件是x lt y 我说不像通常那样 因为通常范围只是一对 但在我的情况下 它超过 例如允许 1 to 5 7 to
  • jQuery:测试复选框是否未被选中

    我很难弄清楚这一点 我有两个复选框 将来会有更多 checkSurfaceEnvironment 1 checkSurfaceEnvironment 2 基本上 我想编写一个 if 语句并测试其中一个是否已检查而另一个是否未检查 完成以下任
  • 如何在 &[u8] 切片中找到子序列?

    我有一个 u8 对二进制缓冲区进行切片 我需要解析它 但是我想使用很多方法 例如str find 似乎不适用于切片 我已经看到我可以通过缓冲区切片和我的模式来隐藏str通过使用from utf8 unchecked 但这似乎有点危险 而且也
  • Selenium WebDriver 在线程“主”org.openqa.selenium.ElementNotInteractableException 中抛出异常

    测试场景 尝试捕获并测试 Gmail 登录 电流输出 Mozilla 实例打开 输入了用户名但是 WebDriver 代码未输入密码 System setProperty webdriver gecko driver C Users Ruc
  • pydub可以设置最大/最小音量吗?

    如标题 我可以设置最大 最小音量的值 即输出音频文件不会太大声或太安静吗 不是标准化 我只是想把具体音量调到正常 如下图 Loudness https en wikipedia org wiki Loudness有点复杂 一个简单的解决方案
  • THREE.JS 场景中永无止境的楼层

    在我的 canvas Three js 场景中创建各个方向连续的地板的最佳方法是什么 最好将 THREE PlaneGeometry 附加到相机位置 以便它随相机移动 或者是否有另一种方法可以使用纹理对场景的地板进行纹理化 我的 Plane
  • 日志中的西里尔文日志显示不正确

    目前 日志以错误的编码 ISO 8859 1 而不是 UTF 8 记录请求和响应 这就是西里尔字母显示不正确的原因 message 目前 库版本 2 3 0 日志文本在 org zalando logbook DefaultHttpLogF
  • WildFly 9.0.1.Final 附带哪些版本的库

    我正在寻找https docs jboss org author display WFLY9 Documentation https docs jboss org author display WFLY9 Documentation 但没有
  • 在Java中将整数转换为int数组[重复]

    这个问题在这里已经有答案了 我对 Java 编程非常陌生 想知道是否有一种方法可以将整数转换为 int 数组 我问的原因是因为我知道可以将整数转换为字符串 所以我希望还有其他快捷方式可供我学习 我想做的一个例子是获取 int 10382 并
  • 模拟器与 iPad 上部署的差异

    我刚刚将我的 iPhone 应用程序部署到我的 iPad 2 我仅有的 iOS 设备 上 并惊讶地发现了这种差异 以及其他功能差异 如果我无法弄清楚 我将在另一篇文章中解决这些差异 每个系统如何显示事物 该应用程序是为 iOS 7 iPho
  • 是否有一个 C# 命令行命令可以帮助我获取应用程序的 GIT 提交哈希值?

    这个问题是后续问题另一个 https stackoverflow com questions 69371809 how to add commit hash to details of an executable file 在这个问题中 有
  • Android - 如何在动画后与视图交互?

    我有一个使用动画的视图翻译动画 http developer android com reference android view animation TranslateAnimation html TranslateAnimation t
  • 我们是否应该对 C# 中从 Microsoft.Rest.ServiceClient 派生的客户端使用单例?

    使用从 swagger 规范 例如与 Azure 资源管理器关联的规范 生成的 Azure NET SDK 时 生成的库利用 Microsoft AutoRest 客户端运行时 并且各种 客户端 均继承自 ServiceClient 我们一