C # การเชื่อมต่อผ่านพร็อกซี


97

ฉันทำงานในสำนักงานที่ต้องมีการเชื่อมต่อทั้งหมดผ่านพร็อกซี http เฉพาะ ฉันต้องเขียนแอปพลิเคชันง่ายๆเพื่อค้นหาค่าบางอย่างจากเว็บเซิร์ฟเวอร์ - มันง่ายมากถ้าไม่มีพร็อกซี ฉันจะทำให้แอปพลิเคชัน C # รับรู้พร็อกซีได้อย่างไร ฉันจะทำการเชื่อมต่อผ่านพร็อกซีได้อย่างไร?

คำตอบ:


108

สิ่งนี้ทำได้อย่างง่ายดายโดยใช้โปรแกรมในโค้ดของคุณหรือประกาศใน web.config หรือ app.config

คุณสามารถสร้างพร็อกซีโดยทางโปรแกรมได้ดังนี้:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

โดยพื้นฐานแล้วคุณกำลังกำหนดWebProxyวัตถุให้กับคุณสมบัติrequestของวัตถุ proxyนี้requestแล้วจะใช้proxyคุณกำหนด

เพื่อให้บรรลุสิ่งเดียวกันโดยประกาศคุณสามารถทำสิ่งต่อไปนี้:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[your proxy address and port number]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

ภายใน web.config หรือ app.config ของคุณ สิ่งนี้ตั้งค่าพร็อกซีเริ่มต้นที่คำขอ http ทั้งหมดจะใช้ ขึ้นอยู่กับสิ่งที่คุณต้องการเพื่อให้บรรลุคุณอาจต้องการหรือไม่ต้องการคุณสมบัติเพิ่มเติมบางอย่างขององค์ประกอบdefaultProxy / proxyดังนั้นโปรดดูเอกสารสำหรับสิ่งเหล่านี้


ในตัวอย่างโปรแกรมคุณไม่ได้ตั้งค่าพอร์ตทำไม?
Skuta

@Skuta - ไม่มีเหตุผลพิเศษ นั่นเป็นเพียงการกำกับดูแลดังในตัวอย่างนั้นฉันใช้ตัวสร้างซึ่งรับ URL (เป็นสตริง) และบูลีนเพื่อพิจารณาว่าที่อยู่ในเครื่องถูกข้ามหรือไม่ หากคุณต้องการหมายเลขพอร์ตเฉพาะอาจเป็นการดีกว่าที่จะใช้ตัวสร้างโอเวอร์โหลดที่อนุญาต URL (เป็นสตริง) และหมายเลขพอร์ต (เป็น Int32) จากนั้นตั้งค่าBypassProxyOnLocalคุณสมบัติเป็น True (หากจำเป็น) ทันทีหลังจากนั้น
CraigTP

2
@Skuta - ฉันได้แก้ไขโพสต์ของฉันเพื่อชี้แจงสิ่งนี้และเพื่อให้แน่ใจว่าตัวอย่างแบบเป็นโปรแกรมและแบบประกาศนั้นทำในสิ่งเดียวกันจริงๆ!
CraigTP

23

หากคุณกำลังใช้WebClientมันมีคุณสมบัติProxy ที่คุณสามารถใช้ได้

ดังที่ได้กล่าวไปแล้วมีหลายวิธีในการตรวจหา / การใช้งานการตั้งค่าพร็อกซีโดยอัตโนมัติ

Web.Config:

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

การใช้ WebProxy คลาสที่อธิบายไว้ในบทความนี้


คุณยังสามารถกำหนดค่าการตั้งค่าพร็อกซีได้โดยตรง (config หรือ code) จากนั้นแอปของคุณจะใช้สิ่งเหล่านั้น

Web.Config:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[proxy address]:[proxy port]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

รหัส:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
WebProxy myproxy = new WebProxy("[proxy address]:[proxy port]", false);
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

7

ลองใช้รหัสนี้ โทรก่อนทำการร้องขอ http ใด ๆ รหัสจะใช้พร็อกซีจากการตั้งค่า Internet Explorer ของคุณ แต่ฉันใช้proxy.Credentials = ....เพราะพร็อกซีเซิร์ฟเวอร์ของฉันเป็นเซิร์ฟเวอร์ Internet Acceleration ที่รับรองความถูกต้องของ NTLM ให้มันหวือ

static void setProxy()
{
    WebProxy proxy = (WebProxy)WebProxy.GetDefaultProxy();
    if(proxy.Address != null)
    {
        proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        WebRequest.DefaultWebProxy = new System.Net.WebProxy(proxy.Address, proxy.BypassProxyOnLocal, proxy.BypassList, proxy.Credentials);
    }
}

3
WebProxy.GetDefaultProxyล้าสมัยตั้งแต่ Framework 4.5 และวิธีนี้ส่งคืนค่าว่าง CredentialCache.DefaultNetworkCredentialsคิดว่าดีกว่าก่อนที่จะใช้ หากคุณใส่บางอย่างใน CredentialCache และพร็อกซีของคุณต้องการข้อมูลรับรองดังกล่าวก็ควรใช้ มิฉะนั้นจะไม่ช่วย
Cassandrad

6

หากคุณต้องการให้แอปใช้พร็อกซีเริ่มต้นของระบบให้เพิ่มสิ่งนี้ใน Application.exe.config ของคุณ (โดยที่ application.exe เป็นชื่อแอปพลิเคชันของคุณ):

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

สามารถดูรายละเอียดเพิ่มเติมได้จากบทความ MSDN ใน System.Net


หมายเหตุ: ส่วน: <system.net> อยู่ในส่วน <configuration> หรือไฟล์ exe.config สิ่งนี้ทำให้พร็อกซีทำงานได้ในแอพคอนโซลง่ายๆที่ฉันปรุงขึ้น
John Dyer

5

ซับเดียวนี้ใช้ได้กับฉัน:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials คือการตั้งค่าพร็อกซีที่ตั้งไว้ใน Internet Explorer

WebRequest.DefaultWebProxy.Credentials ใช้สำหรับการเชื่อมต่ออินเทอร์เน็ตทั้งหมดในแอปพลิเคชัน


1
"CredentialCache.DefaultNetWorkCredentials คือการตั้งค่าพร็อกซีที่ตั้งไว้ใน Internet Explorer" ยังคงเป็นเช่นนี้อยู่หรือไม่? ฉันไม่พบที่ใดในตัวเลือกอินเทอร์เน็ต> การเชื่อมต่อ> การตั้งค่า LAN เพื่อเขียนชื่อผู้ใช้และรหัสผ่าน
Matt

จากเอกสาร: "สำหรับแอปพลิเคชันฝั่งไคลเอ็นต์โดยปกติจะเป็นข้อมูลรับรอง Windows (ชื่อผู้ใช้รหัสผ่านและโดเมน) ของผู้ใช้ที่เรียกใช้แอปพลิเคชัน"
Coert Grobbelaar

คำตอบนี้อาจจะค่อนข้างแย่ แต่ฉันค่อนข้างแน่ใจว่ามันเป็นจริงสำหรับหน้าต่างปี 2015
Coert Grobbelaar

4

รหัสของ Foole ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน แต่ใน. NET 4.0 อย่าลืมตรวจสอบว่า Proxy เป็น NULL หรือไม่ซึ่งหมายความว่าไม่มีการกำหนดค่าพร็อกซี (ภายนอกสภาพแวดล้อมขององค์กร)

นี่คือรหัสที่แก้ไขปัญหาของฉันกับพร็อกซีขององค์กรของเรา

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;


0

การตรวจหาพร็อกซีอัตโนมัติเป็นกระบวนการที่ระบบระบุเว็บพร็อกซีเซิร์ฟเวอร์และใช้เพื่อส่งคำขอในนามของไคลเอ็นต์ คุณลักษณะนี้เรียกอีกอย่างว่า Web Proxy Auto-Discovery (WPAD) เมื่อเปิดใช้งานการตรวจหาพร็อกซีอัตโนมัติระบบจะพยายามค้นหาสคริปต์คอนฟิกูเรชันพร็อกซีที่รับผิดชอบในการส่งคืนชุดของพร็อกซีที่สามารถใช้สำหรับการร้องขอ

http://msdn.microsoft.com/en-us/library/fze2ytx2.aspx


4
สิ่งนี้ตอบคำถามได้อย่างไร? OP จะนำข้อมูลนี้ไปใช้ได้อย่างไร?
Cullub

0
            var getHtmlWeb = new HtmlWeb() { AutoDetectEncoding = false, OverrideEncoding = Encoding.GetEncoding("iso-8859-2") };

            WebProxy myproxy = new WebProxy("127.0.0.1:8888", false);
            NetworkCredential cred = (NetworkCredential)CredentialCache.DefaultCredentials;
            var document = getHtmlWeb.Load("URL", "GET", myproxy, cred);

5
ควรเขียนคำอธิบายวิธีแก้ปัญหาของคุณไม่ใช่แค่โพสต์โค้ด คุณสามารถแก้ไขข้อความที่จะช่วยผู้อ่านได้หรือไม่?
Brian Tompsett - 汤莱恩

0

ฉันจะใช้ตัวอย่างเพื่อเพิ่มคำตอบด้านบน

ฉันพบปัญหาพร็อกซีขณะพยายามติดตั้งแพ็คเกจผ่านWeb Platform Installer

นั่นก็ใช้ไฟล์ config ซึ่งก็คือWebPlatformInstaller.exe.config

ฉันลองแก้ไขคำแนะนำในฟอรัม IISซึ่งเป็น

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.net>    
     <defaultProxy enabled="True" useDefaultCredentials="True"/>      
   </system.net>
</configuration>

และ

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
   <system.net>    
     <defaultProxy>      
          <proxy 
               proxyaddress="http://yourproxy.company.com:80" 
               usesystemdefault="True"
               autoDetect="False" />    
     </defaultProxy>  
   </system.net>
</configuration>

สิ่งเหล่านี้ไม่ได้ผล

สิ่งที่ได้ผลสำหรับฉันคือสิ่งนี้ -

<system.net>    
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="WebPI.Net.AuthenticatedProxy, WebPI.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79a8d77199cbf3bc" />
    </defaultProxy>  
 </system.net>

โมดูลจำเป็นต้องลงทะเบียนกับ Web Platform Installer เพื่อที่จะใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.