47

認証を必要とするプロキシを使用しています。つまり、ブラウザーでページを開こうとすると、すぐに資格情報を要求されます。プログラムで同じ資格情報を提供しましたが、HTTP 407 エラーで失敗します。

これが私のコードです:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

IWebProxy proxy = WebRequest.GetSystemWebProxy();
CredentialCache cc = new CredentialCache();
NetworkCredential nc = new NetworkCredential();

nc.UserName = "userName";
nc.Password = "password";
nc.Domain = "mydomain";
cc.Add("http://20.154.23.100", 8888, "Basic", nc);
proxy.Credentials = cc;
//proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
request.Proxy = proxy;
request.Proxy.Credentials = cc;
request.Credentials = cc;
request.PreAuthenticate = true;

可能な限りのことを試しましたが、何かが足りないようです。リクエストを2つしなければならないようなものですか?最初に資格情報がなく、資格情報の必要性についてサーバーから返信があった場合、資格情報を使用して同じ要求を行いますか?

4

7 に答える 7

80

この方法により、プロキシ資格情報をハードコーディングまたは構成する必要がなくなる可能性があり、これは望ましい場合があります。

これをアプリケーション構成ファイル (おそらく app.config) に入れます。Visual Studio はビルド時に名前を yourappname.exe.config に変更し、最終的に実行可能ファイルの隣に配置されます。アプリケーション構成ファイルがない場合は、Visual Studio の [新しい項目の追加] を使用して追加します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>
</configuration>
于 2012-08-02T23:11:03.127 に答える
29

HttpWebRequest がデフォルトで正しいプロキシの詳細を取得せず、UseDefaultCredentials の設定も機能しないという非常によく似た状況が発生していました。ただし、コードで設定を強制すると、うまくいきました。

IWebProxy proxy = myWebRequest.Proxy;
if (proxy != null) {
    string proxyuri = proxy.GetProxy(myWebRequest.RequestUri).ToString();
    myWebRequest.UseDefaultCredentials = true;
    myWebRequest.Proxy = new WebProxy(proxyuri, false);
    myWebRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

これはデフォルトの資格情報を使用するため、ユーザーに詳細を尋ねるべきではありません。

于 2013-08-02T09:30:57.483 に答える
18

クレデンシャルとともにプロキシを使用する正しい方法は次のとおりです。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

IWebProxy proxy = request.Proxy;                    
if (proxy != null)
{
    Console.WriteLine("Proxy: {0}", proxy.GetProxy(request.RequestUri));
}
else
{
    Console.WriteLine("Proxy is null; no proxy will be used");
}

WebProxy myProxy = new WebProxy();
Uri newUri = new Uri("http://20.154.23.100:8888");
// Associate the newUri object to 'myProxy' object so that new myProxy settings can be set.
myProxy.Address = newUri;
// Create a NetworkCredential object and associate it with the 
// Proxy property of request object.
myProxy.Credentials = new NetworkCredential("userName", "password");
request.Proxy = myProxy;

みんな助けてくれてありがとう... :)

于 2012-03-07T14:58:22.953 に答える
4

この問題は何年もの間私を悩ませていました。私にとって唯一の回避策は、ネットワーク チームにファイアウォールで例外を作成するよう依頼することでした。これにより、特定の URL 要求がプロキシで認証される必要がなくなりましたが、これは理想的ではありませんでした。

最近、プロジェクトを 3.5 から .NET 4 にアップグレードしました。コードは、プロキシのデフォルトの資格情報を使用して動作し始めました。資格情報のハードコーディングなどはありません。

request.Proxy.Credentials = CredentialCache.DefaultCredentials;
于 2015-05-21T11:18:35.057 に答える
1

パスワードで保護されたプロキシサーバーが原因で同様の問題が発生し、そこにある情報をあまり見つけることができませんでした-うまくいけば、これは誰かを助けます. 顧客のブラウザで使用されている資格情報を取得したかったのです。ただし、プロキシが独自のユーザー名とパスワードを持っている場合、CredentialCache.DefaultCredentials と DefaultNetworkCredentials は機能しません。これらの詳細を入力して Internet Explorer と Edge がアクセスできるようにしたにもかかわらずです。

最終的に私にとっての解決策は、「CredentialManagement.Standard」と呼ばれるナゲットパッケージと以下のコードを使用することでした:

using WebClient webClient = new WebClient();    
var request = WebRequest.Create("http://google.co.uk");
var proxy = request.Proxy.GetProxy(new Uri("http://google.co.uk"));

var cmgr = new CredentialManagement.Credential() { Target = proxy.Host };
if (cmgr.Load())
{
    var credentials = new NetworkCredential(cmgr.Username, cmgr.Password);
    webClient.Proxy.Credentials = credentials;
    webClient.Credentials = credentials;
}

これにより、「Credentials Manager」から資格情報が取得されます。これは Windows で見つけることができます。[スタート] をクリックし、「Credentials Manager」を検索します。ブラウザでプロンプトが表示されたときに手動で入力したプロキシの資格情報は、Windows 資格情報セクションに表示されます。

于 2020-12-17T17:07:37.267 に答える
-1

これを試して

        var YourURL = "http://yourUrl/";

         HttpClientHandler handler = new HttpClientHandler() 
         { 
             Proxy = new WebProxy("http://127.0.0.1:8888"), 
             UseProxy = true, 
         }; 

         Console.WriteLine(YourURL); 

         HttpClient client = new HttpClient(handler); 
于 2015-11-05T16:09:18.250 に答える