错误(407)“需要代理身份验证”

本文关键字:代理 身份验证 错误 | 更新日期: 2023-09-27 17:54:02

我有一个需求,像…我想从一个winforms访问一个url(登录页面是web)。我必须将凭据传递给该url,响应应该是经过身份验证的网页(标记)的内容。

我已经写了一个函数,它将请求url并返回响应。但是我得到错误代码(407)

"Proxy Authentication Required."

这是我的代码。

private static void GetPageContent(){
    string url = "https://LoginPage.aspx/";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";
    // If required by the server, set the credentials.
    //request.Proxy.Credentials = CredentialCache.DefaultCredentials;
    request.Credentials = new NetworkCredential("user1", "testuser#");
    // Get the response.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    // Display the status.
    Console.WriteLine(response.StatusDescription);
    // Get the stream containing content returned by the server.
    Stream dataStream = response.GetResponseStream();
    // Open the stream using a StreamReader for easy access.
    StreamReader reader = new StreamReader(dataStream);
    // Read the content.
    string responseFromServer = reader.ReadToEnd();
    // Display the content.
    Console.WriteLine(responseFromServer);
    // Cleanup the streams and the response.
    reader.Close();
    dataStream.Close();
    response.Close();
}

错误(407)“需要代理身份验证”

WebProxy proxy = new WebProxy(proxyAddress);
proxy.Credentials = new NetworkCredential("username", "password", "domain");
proxy.UseDefaultCredentials = true;
WebRequest.DefaultWebProxy = proxy;
HttpWebRequest request = new HttpWebRequest();
request.Proxy = proxy;

或者你可以用WebClient

WebClient client = new WebClient();
client.Proxy = proxy;
string downloadString = client.DownloadString("http://www.google.com");

你可能想看看MSDN上的System.Net.HttpWebRequest.Proxy。
这提供了如何设置代理身份验证的详细信息。

也有一个工作代码示例在这个SO答案:https://stackoverflow.com/a/9603791/204690

例如:

// Create a new request to the mentioned URL.               
HttpWebRequest myWebRequest= (HttpWebRequest)WebRequest.Create("http://www.microsoft.com");
// Obtain the 'Proxy' of the  Default browser.  
IWebProxy proxy = myWebRequest.Proxy;
if (proxy != null)
{
    // Create a NetworkCredential object and associate it with the  
    // Proxy property of request object.
    proxy.Credentials=new NetworkCredential(username,password);
    // or 
    proxy.UseDefaultCredentials = true; 
    // try forcing the proxy to use http (just to the proxy not from proxy to server)
    UriBuilder proxyAddress = new UriBuilder(proxy.Address);
    proxyAddress.Scheme = "http";
    myWebRequest.Proxy=proxy;
}
HttpWebResponse myWebResponse=(HttpWebResponse)myWebRequest.GetResponse();

对我来说,这就像告诉它使用DefaultCredentials一样简单(尽管我仍然没有弄清楚为什么它不能默认使用这些):

request.Proxy.Credentials = (System.Net.NetworkCredential)System.Net.CredentialCache.DefaultCredentials;

您可以先检查是否可以连接到代理。下面是一个例子:

 System.Net.Sockets.Socket sock = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
                sock.Connect(url, proxyPort);
                if (sock.Connected == true)  // Port is in use and connection is successful
                {
                    sock.Close();
                    return true;
                }
                else
                {
                    sock.Close();
                }`enter code here`
                return false;