使用单例HttpClient与Microsoft.Rest.ServiceClient - 出现System.MissingMethodException问题

4
我正在尝试重新设计我的Azure API客户端,使用单例HttpClient来为ServiceClient<T>服务,因为多个来源建议这样做(出于性能考虑,也是Microsoft.Rest.ServiceClient“通常情况下”使用的HttpClient的建议方法)。
我使用的是Microsoft.Rest.ClientRuntime.2.3.12版本。
我看到Microsoft.Rest.ServiceClient有一个构造函数可以重用HttpClient
protected ServiceClient(HttpClient httpClient, bool disposeHttpClient = true);

这是我API客户端的构造函数,目的是为了重复使用HttpClient,但是当它被调用时,会出现System.MissingMethodException错误:Void Microsoft.Rest.ServiceClient`1..ctor(System.Net.Http.HttpClient, Boolean)

public MyAPIclient(ServiceClientCredentials credentials, HttpClient client) 
    : base(client, disposeHttpClient: false)
{
    this._baseUri = new Uri("https://...");
    if (credentials == null)
    {
        throw new ArgumentNullException("credentials");
    }
    this.Credentials = credentials;
    Credentials?.InitializeServiceClient(this);
}

这是我如何调用API客户端。
using (var apiClient = new MyAPIclient(credentials, HttpClientSingleton.Client)) 
//I get Method not found 'Void Microsoft.Rest.ServiceClient`1..ctor(System.Net.Http.HttpClient, Boolean)'
{
    //some api call
}

这是我如何实例化我的http客户端单例

public static class HttpClientSingleton
{
    public static readonly HttpClient Client = new HttpClient() { Timeout = TimeSpan.FromMinutes(30) };
}

为什么会出现这个异常(我看到ServiceClientctor(httpClient, bool))?

如何解决这个问题?


HttpClient 的版本是什么? - MT-FreeHK
尝试恢复 NuGet 包。 - Nkosi
@MatrixTai 组装 System.Net.Http,版本=4.0.0.0 ...NETFramework\v4.5.2\System.Net.Http.dll - Prokurors
1
也许你应该尝试更新一个新版本,或者更改绑定程序集,请参考此链接:https://github.com/Azure/autorest/issues/2857#issuecomment-422520170 - MT-FreeHK
1个回答

4
像Nkosi所说的那样,您应该尝试恢复NuGet包,清除obj/bin并重新构建。当事情失去步调时,通常会出现这种情况。由于所有的影子缓存等等,事情可能会不匹配。我根据您的代码创建了一个小例子,没有任何问题。如果您发现仍然无法正常工作,则应在文件中包含更多信息,例如类声明和使用语句以及您正在使用的.NET版本。
以下内容适用于我的4.5.2 ServiceClient 2.3.12版本。
using Microsoft.Rest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Program
{
    static void Main(string[] args)
    {
        using (var apiClient = new MyAPIclient(null, HttpClientSingleton.Client))
        //I get Method not found 'Void Microsoft.Rest.ServiceClient`1..ctor(System.Net.Http.HttpClient, Boolean)'
        {
            var httpClient = apiClient.HttpClient;
        }
    }

    public class MyAPIclient : ServiceClient<MyAPIclient>
    {
        protected Uri _baseUri { get; set; }
        protected ServiceClientCredentials Credentials { get; set; }

        public MyAPIclient(ServiceClientCredentials credentials, HttpClient client) : base(client, disposeHttpClient: false)
        {
            this._baseUri = new Uri("https://stackoverflow.com");
            this.Credentials = credentials;
            if(credentials != null)
                Credentials?.InitializeServiceClient(this);
        }
    }

    public static class HttpClientSingleton
    {
        public static readonly HttpClient Client = new HttpClient() { Timeout = TimeSpan.FromMinutes(30) };
    }

}
}

嗯...做了这么多事情,但结果仍然相同。我有一个想法,可能是我没有正确实例化HttpClient(在帖子中看到)? 我正在使用.NET 4.5.2,当我尝试构建Api客户端时抛出异常"Method not found: 'Void Microsoft.Rest.ServiceClient`1..ctor(System.Net.Http.HttpClient, Boolean)'。" - Prokurors
请原谅,我是新手,但我复制/粘贴上面的代码可以在 .net 4.5.2 和 ServiceClient 2.3.12 上运行。您是否可能在多个项目中使用不匹配的 nuget 包,导致获取错误的包? - Neil.Work
我该如何检查是否存在不匹配的NuGet包?如何确保使用特定的包?是通过在app.config/web.config文件中设置dependentAssembly的bindingRedirect来实现吗? - Prokurors
2
有时候在构建输出中会收到警告,但是如果你在VS中右键单击解决方案文件,你可以选择“管理解决方案的NuGet包...”,如果你找到了这个包,你就可以看到哪些项目安装了哪个版本。通常通过这个界面管理包比逐个处理更容易。 - Neil.Work
我创建了一个干净的控制台项目,并从该解决方案中使用了我的 ApiClient,它可以正常工作...所以我想你是对的 - 我会看看是否能找到原始解决方案的问题,然后接受你的答案。谢谢! - Prokurors
原来我安装了多个Microsoft.Rest.ServiceClient包……将它们全部升级到2.3.12版本后,问题就解决了。 - Prokurors

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