C# 通过WPAD脚本动态使用WebProxy

C# 通过WPAD脚本动态使用WebProxy,c#,.net,proxy,webproxy,C#,.net,Proxy,Webproxy,我正在打电话给一家网络服务公司。我需要使用一个使用WPAD脚本的代理。此WPAD脚本的URL因应用程序的不同部署而不同 虽然IE具有正确的代理设置,但应用程序作为windows服务运行,在本地系统帐户下运行,因此应用程序不知道此windows用户的IE设置 将以下内容放入app.config中会起作用: <system.net> <defaultProxy enabled="true" useDefaultCredentials="true" >

我正在打电话给一家网络服务公司。我需要使用一个使用WPAD脚本的代理。此WPAD脚本的URL因应用程序的不同部署而不同

虽然IE具有正确的代理设置,但应用程序作为windows服务运行,在本地系统帐户下运行,因此应用程序不知道此windows用户的IE设置

将以下内容放入app.config中会起作用:

<system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true" >
        <proxy autoDetect="True" scriptLocation="http://url.to/wpad.dat"/>
    </defaultProxy>
</system.net>

但这有一个限制,即用户无法配置它。有没有一种方法可以从(C#-)代码中动态执行上述操作?我还怀疑上述情况将改变不应通过代理的Web服务的行为(但我尚未验证)


在上,我找到了有用的文本:“(有关演示如何使用WPAD功能的示例,请参阅IWebProxyScript类的文档。)”但我没有找到示例:(.

这篇关于代码项目的文章介绍了如何使用windows API执行PAC脚本并返回给定url的正确代理详细信息:


您可以使用该函数查找代理详细信息,然后直接配置web服务对象代理,或者更改WebRequest.DefaultProxy。

IWebProxyScript由WebProxy本身在内部使用

如果您使用WPAD脚本的URL初始化WebProxy,它将解析传递给它的请求的正确URL。您可以将该WebProxy设置为WebRequest,它将自动处理为请求目标设置正确的代理URL

WebRequest request = WebRequest.Create("http://targeturl");
request.Proxy = new WebProxy("http://url.to/wpad.dat");
您还可以获取给定目标的代理URL,如下所示:

WebProxy proxy = new WebProxy("http://url.to/wpad.dat");    
Uri proxyUri = proxy.GetProxy(new Uri("http://targeturl"));

这不适用于PAC脚本。

我在这里发现了类似的情况:但WPAD可以返回多个ProxyServer(请参阅故障转移和/或负载平衡)。然后返回分号分隔的ProxyServer。返回“DIRECT”的条目使用此方法似乎会消失。因此,虽然这是朝着正确方向迈出的一步,但对我来说似乎并不完整。您是否可以在返回值上使用string.split来获取条目列表,然后按顺序尝试,如果列表为空,则默认不使用代理?这就是我最终要做的。但我不喜欢它:-我现在有一个循环为我找到的每个代理执行webrequest-我不知道如何处理DIRECT。如果我得到一个空列表,我现在不使用任何代理,但我看到过同时返回代理和DIRECT的示例,因此这可能不是真正正确的方法。-如果webrequest超时,我真的不知道为什么。可能是代理,可能是什么e、 因此,我用另一个代理重复该请求。可能是另一个超时?用户等待…-我真的不想这样做。我希望操作系统来处理它…这是IE在使用自动配置脚本时的工作方式。如果这导致问题,可能是PAC脚本(超出应用程序的控制范围)或代理服务器(同上),所以你真的做得再好不过了。当然,如果你的web服务关闭,用户将不得不等待你检查所有代理,然后他们才会发现。直接只是指直接连接-不要使用代理。