具有代理和凭据的WebRequest

时间:2012-11-26 10:42:30

标签: c# web

我有以下情况:

要连接到互联网,我使用代理...我不完全知道代理设置,但我们使用网址自动检索配置等...

在连接到外部资源后,我必须提供与我的机器凭据不同的用户凭据。

我现在的问题:

如何将no连接到某些资源,例如google? 我有以下代码,其中哪些方法不起作用:

        string url = @"http://www.google.com";
        WebRequest request = WebRequest.Create(url);

        Console.WriteLine("Starting");

        using (WebResponse webResponse = request.GetResponse())
        {
            //TODO
        }
        Console.WriteLine("Finished");
        Console.ReadLine();

还尝试了这个额外的道具:

        request.Proxy = WebRequest.DefaultWebProxy;
        request.Credentials = CredentialCache.DefaultCredentials;
        request.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
        NetworkCredential networkCredential = new NetworkCredential("usr", "psw");
        request.Credentials = networkCredential;

知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试添加类似于App.Config的内容:

<system.net>
  <defaultProxy enabled="true" useDefaultCredentials="true">
  </defaultProxy>
</system.net>

如果这不起作用,您可以构建自己的代理类,如下所示:

添加类似于App.Config的内容:

<system.net>
  <defaultProxy enabled="true" useDefaultCredentials="false">
    <module type="Your.MyProxy, YourApp" />
  </defaultProxy>
</system.net>

其中Your.Proxy是代理类的名称空间和类名。然后创建一个类似于此的类:

// In namespace Your
// ...

public class MyProxy: IWebProxy
{
    /// ====================================================================
    /// <summary>
    /// The credentials to submit to the proxy server for authentication.
    /// </summary>
    /// <returns>An <see cref="T:System.Net.ICredentials"/> instance that contains the 
    /// credentials that are needed to authenticate a request to the proxy server.</returns>
    /// ====================================================================
    public ICredentials Credentials
    {
        get 
        {
            // Read all values from the AppSettings
            string username = ConfigurationManager.AppSettings["ProxyUsername"].ToString();
            string password = ConfigurationManager.AppSettings["ProxyPassword"].ToString();
            string domain = ConfigurationManager.AppSettings["ProxyDomain"].ToString();
            return new NetworkCredential(username, password, domain); 
        }            
        set { }
    }

    /// ====================================================================
    /// <summary>
    /// Returns the URI of a proxy.
    /// </summary>
    /// <param name="destination">A <see cref="T:System.Uri"/> that specifies the requested 
    /// Internet resource.</param>
    /// <returns>
    /// A <see cref="T:System.Uri"/> instance that contains the URI of the proxy used to 
    /// contact <paramref name="destination"/>.
    /// </returns>
    /// ====================================================================
    public Uri GetProxy(Uri destination)
    {
        // Use the proxy server specified in AppSettings
        string proxy = ConfigurationManager.AppSettings["ProxyServer"].ToString();
        return new Uri(proxy);
    }

    /// ====================================================================
    /// <summary>
    /// Indicates that the proxy should not be used for the specified host.
    /// </summary>
    /// <param name="host">The <see cref="T:System.Uri"/> of the host to check for proxy use.</param>
    /// <returns>
    /// true if the proxy server should not be used for <paramref name="host"/>; otherwise, false.
    /// </returns>
    /// ====================================================================
    public bool IsBypassed(Uri host)
    {
        // Ignore localhost URIs
        string[] bypassUris = ConfigurationManager.AppSettings["ProxyBypass"].ToString().Split(',');
        foreach (string bypassUri in bypassUris)
        {
            if (host.AbsoluteUri.ToLower().Contains(bypassUri.Trim().ToLower()))
            {
                return true;
            }
        }

        return false;
    }
}

然后您可以在App.Config中添加更多设置,例如:

<!-- New Proxy settings -->
<add key="ProxyUsername" value="User123" />
<add key="ProxyPassword" value="Password456" />
<add key="ProxyDomain" value="your.domain" />
<add key="ProxyServer" value="http://123.456.789.000:8080" />
<add key="ProxyBypass" value="localhost, another_server" />

我希望这可以帮助您走上正确的轨道?