摘要:如果代理设置为自动发现,我们的.NET WPF应用程序似乎无法检测代理。这意味着我们的应用程序在尝试使用Azure AD进行身份验证之后以及当我们尝试下载要用于登录应用程序的令牌时失败。
但是,如果我们手动定义互联网选项中的代理设置,应用程序就可以正常加载。
即。当以下设置为代理服务器IP时。
另一个有趣的一点是,当代理设置为自动检测我们是否通过Internet Explorer或chrome联系我们的服务时,我们可以看到WSDL。
我们怀疑问题可能是我们系统中的Microsoft azure身份验证部分绕过代理。在这个特定的网络设置中,绕过代理的任何东西都无法通过火灾,因此,应用程序失败并显示错误“未知错误:未知错误”。
我们尝试过的关键事项包括: •这在app.config的system.net部分中:
<system.net>
<defaultProxy useDefaultCredentials="true">
<proxy bypassonlocal="True" usesystemdefault="True" />
</defaultProxy>
</system.net>
•这在app.config的bindings部分中(注意bypassProxyOnLocal =“true”,useDefaultWebProxy =“true”和proxyCredentialType =“Windows”):
<wsHttpBinding>
<binding name="InternalWsHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="Message">
<transport clientCredentialType="None" proxyCredentialType="Windows" realm="" />
</security>
</binding>
</wsHttpBinding>
答案 0 :(得分:2)
您想要检测网络的代理,然后强制所有外部网络呼叫都要通过它。
完全从app.config文件中删除代理详细信息,包括整个<system.net>
元素,在<binding>
部分中删除bypassProxyOnLocal
属性useDefaultWebProxy
属性,和proxyCredentialType
属性。
然后,在您的代码中,在进行任何网络调用之前,检测网络代理并将其用作DefaultWebProxy:
var testAddress = new Uri("http://google.com"); //can be any external URL that goes through the network's proxy
var proxy = WebRequest.DefaultWebProxy.GetProxy(testAddress); //returns the testAddress if it can't find a proxy
if (proxy != testAddress)
{
//Found a proxy!
var webProxy = new WebProxy(proxy, BypassOnLocal: true) //BypassOnLocal is your choice!
{
UseDefaultCredentials = true
};
WebRequest.DefaultWebProxy = webProxy;
}
现在,您的所有网络电话都应通过自动检测到的代理。如果您正在与本地网络中的服务器通信,请根据您是否要将代理用于本地网络中的地址来设置BypassOnLocal属性。