【问题标题】:Get system default web proxy in .NET Core在 .NET Core 中获取系统默认 Web 代理
【发布时间】:2019-12-15 12:14:31
【问题描述】:

以下代码采用目标 uri 并将其内容作为流获取。在进行网络调用之前,它会检查是否需要代理来访问目标 uri。

这非常适用于全框架(即 v4.8)中的 .NET 应用程序:

    var targetUri = new Uri("...");
    HttpClient client;

    // get the system default web proxy ...
    var proxyUri = WebRequest.DefaultWebProxy.GetProxy(targetUri);

    // ... and check whether it should be used or not
    var proxyAuthorityEqualsTargetAuthority = proxyUri?.Authority?.Equals(targetUri.Authority) == true;
    var proxyRequired = !proxyAuthorityEqualsTargetAuthority;

    if (proxyRequired)
    {
        var proxy = new WebProxy()
        {
            Address = proxyUri,
            BypassProxyOnLocal = false,
            UseDefaultCredentials = true
        };

        var httpClientHandler = new HttpClientHandler { Proxy = proxy };
        client = new HttpClient(handler: httpClientHandler, disposeHandler: true);
    }
    else
    {
        client = new HttpClient();
    }

    await client.GetStreamAsync(targetUri) ... 

但它在 .NET Core 应用程序中不起作用:

访问WebRequest.DefaultWebProxy.GetProxy(targetUri) 将抛出PlatformNotSupportedException

此平台不支持操作。

所以我尝试了这一行,它也受 .NET Core 支持:

    // deprecated: var proxyUri = new Uri(WebRequest.DefaultWebProxy.GetProxy(targetUri).AbsoluteUri);
    var proxyUri = new WebProxy().GetProxy(targetUri);

但是,返回的 proxyUri.Authority 现在总是返回 targetUri(在 .NET 和 .NET Core 中),而不是像 WebRequest.DefaultWebProxy.GetProxy(targetUri) 在 .NET 中那样返回代理服务器的地址。

这样,proxyAuthorityEqualsTargetAuthority 始终为真,因此,proxyRequired 始终为假。直接访问目标uri会抛出407 (Proxy Authentication Required)

有谁知道如何获取.NET Core 中默认网络代理的地址?

【问题讨论】:

    标签: c# .net-core proxy


    【解决方案1】:

    好的,我不知道我在几周前尝试this 时错过了什么。我又试了一次,一切似乎都很好。

    使用CredentialCache.DefaultCredentials,此短代码适用于:.NET 和 .NET Core。

        var targetUri = new Uri("...");
    
        var handler = new HttpClientHandler();
        handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
        var client = new HttpClient(handler, disposeHandler: true);
    
        await client.GetStreamAsync(targetUri) ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2019-08-04
      • 1970-01-01
      • 2010-12-26
      • 2011-10-31
      • 2011-07-16
      相关资源
      最近更新 更多