Использование одноэлементного HttpClient с Microsoft.Rest.ServiceClient - получение System.MissingMethodException - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь переделать мой клиент API Azure для использования синглтона HttpClient для ServiceClient<T>, поскольку для этого предложено несколько источников (для повышения производительности, и также предлагается подход для HttpClient, который используется за кулисамидля Microsoft.Rest.ServiceClient "в общем")

Я использую версию 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-клиентаsingleton

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

Почему я получаю это исключение (я вижу, что ServiceClient имеет ctor(httpClient, bool))?

Как исправить эту проблему?

1 Ответ

0 голосов
/ 23 октября 2018

Как сказал Nkosi, вы должны попытаться восстановить пакеты nuget, очистить ваш obj / bin и перестроить.Это обычно происходит, когда все выходит из-под контроля.Со всем кэшированием теней и т. Д. Вещи могут в конечном итоге не соответствовать друг другу.Я создал небольшой пример на основе вашего кода, и с ним не было никаких проблем.Если вы обнаружите, что это по-прежнему не работает, вы должны включить в свой файл дополнительную информацию, такую ​​как объявления классов и ваши операторы использования, а также какую версию .net вы используете.

Ниже показано, как работает 4.5.2 Сервисный клиент 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) };
    }

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...