Использовать WebProxy для HttpClient, который я не контролирую - PullRequest
0 голосов
/ 28 июня 2018

Существует библиотека, которая инициализирует свой собственный частный HttpClient. Мне нужно использовать определенный прокси ip и порт, когда определенный URL используется в этом HttpClient. Поскольку библиотека является сторонней, я не могу отправить ей обработчик и установить для нее прокси.

Одно решение, о котором я подумал, возможно, заключается в использовании defaultProxy в app.config. Проблема заключается в том, что мне нужен только один конкретный подстановочный знак URL, чтобы пройти через этот прокси-сервер, а все остальные URL-адреса должны быть свободны от прокси.

В DefaultProxy существует понятие bypasslist, но в принципе мне нужен противоположный белый список, в котором активен прокси.

У кого-нибудь есть идеи о том, как достичь того, что нам нужно? Использование любого программного обеспечения вне кода невозможно (например, отладочный прокси / fiddler)

Учитывая URL, для которого мы хотим, чтобы прокси был активным, что-то вроде https://www.que.dok.com/services/* Можно ли передать регулярное выражение в обходной список, который обходит каждый URL, если он не совпадает, если да, то каким будет регулярное выражение?

1 Ответ

0 голосов
/ 02 июля 2018

Если вы используете .NET Framework, а библиотека использует WinINet Реализация стека HTTP (HttpClientHandler в .NET Framework), вы можете установить свойство WebRequest.DefaultWebProxy для пользовательского декоратора IWebProxy, который использует обычный выражение, чтобы решить, когда вызывать упакованный экземпляр IWebProxy. В противном случае рассмотрите возможность создания пользовательской ветви кодовой базы библиотеки, соответствующей вашим потребностям.

Пример реализации:

public class FilteredProxy : IWebProxy
{
    readonly IWebProxy _wrapped;
    readonly Regex _useFor;
    public FilteredProxy(IWebProxy wrapped, Regex useFor)
    {
        _wrapped = wrapped;
        _useFor = useFor;
    }

    public bool IsBypassed(Uri host)
    {
        return !_useFor.IsMatch(host.ToString()) || _wrapped.IsBypassed(host);
    }

    public Uri GetProxy(Uri destination) => _wrapped.GetProxy(destination);

    public ICredentials Credentials
    {
        get => _wrapped.Credentials;
        set => _wrapped.Credentials = value;
    }
}

Создание экземпляра FilteredProxy один раз перед любым HTTP-запросом:

WebRequest.DefaultWebProxy = new FilteredProxy(wrapped: yourProxy,
                                               useFor: new Regex("YOUR_REGEX_HERE", RegexOptions.Compiled));

Для получения дополнительной информации проверьте:

...