App.Config 中的默认代理导致 .NET 应用程序无错误地崩溃

Default proxy in App.Config cause .NET application to crash with no error

我有一个 C# .NET 程序 (4.7.1),我想使用默认系统代理(如果有的话)。

当我将以下代码放入 App.Config 文件时:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
    </defaultProxy>
  </system.net>
 ... rest of the file
</configuration>

应用程序在 KERNELBASE.dll 启动时崩溃,没有错误并立即退出。

我已经使用 fiddler 在本地主机上设置了一个代理(做一些测试)

我可以在事件日志中找到以下不是很有用的错误:

Faulting application name: myprogram.exe, version: 0.01.6652.23883, time stamp: 0x5aaf246f
Faulting module name: KERNELBASE.dll, version: 10.0.16299.15, time stamp: 0x2cd1ce3d
Exception code: 0xe0434352
Fault offset: 0x001008b2
Faulting process id: 0x1220
Faulting application start time: 0x01d3bf2e95ca9d05
Faulting application path: C:\source\myprogram.exe
Faulting module path: C:\Windows\System32\KERNELBASE.dll
Report Id: 5a60273b-637f-4dac-ae09-5539fb563884
Faulting package full name: 
Faulting package-relative application ID: 

我哪里出错了以及如何让默认代理在 C# .NET 程序中工作有什么想法吗?

根据the docs

The proxy element defines a proxy server for an application. If this element is missing from the configuration file, then the .NET Framework will use the proxy settings in Internet Explorer.

我敢猜测您尝试 运行 的机器没有 Internet Explorer,这导致了崩溃。

无论如何,添加代理服务器设置以确保您的应用程序运行在未安装 Internet Explorer 的计算机上运行是有意义的。

<configuration>  
  <system.net>  
    <defaultProxy enabled="true" useDefaultCredentials="true">  
      <proxy  
        usesystemdefault="true"  
        proxyaddress="http://192.168.1.10:3128"  
        bypassonlocal="true"  
      />  
    </defaultProxy>  
  </system.net>  
</configuration> 

如果您想 检测 代理,则无法使用 app.config 来实现,因为 .NET 中不存在该功能。相反,您必须按照以下方式做一些事情:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy;
if (proxy.Address.AbsoluteUri != string.Empty)
{
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri);
    wc.Proxy = proxy;
}

参考:C# auto detect proxy settings

这就是我最后所做的(基本上是 NightOwl888 建议的)添加了 GetSystemWebProxy

var proxy = WebRequest.GetSystemWebProxy();    
_webRequestHandler = new WebRequestHandler { ClientCertificateOptions = ClientCertificateOption.Automatic };
        
_webRequestHandler.Proxy = proxy;
_client = new HttpClient(_webRequestHandler);
        
_client.BaseAddress = new Uri(connectionUrl);
_client.Timeout = new TimeSpan(0,0,0,timeoutSeconds);