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

时间:2018-03-19 03:03:40

标签: c# .net proxy app-config

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

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

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: 

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

我已经使用fiddler(进行一些测试)在localhost上设置了代理

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

{{1}}

我出错的任何想法以及如何在C#.NET程序中使用默认代理?

2 个答案:

答案 0 :(得分:0)

根据the docs

  

proxy元素定义应用程序的代理服务器。如果配置文件中缺少此元素,则.NET Framework将使用Internet Explorer中的proxy设置。

我冒昧地猜测你试图运行它的机器没有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

答案 1 :(得分:0)

这就是我最后做的事情(基本上是 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);