Mandat RFC yang "baik" dari setiap klien RFC bahwa mereka berhati-hati karena tidak menggunakan lebih dari 2 koneksi per host ...
Microsoft menerapkan ini di WebClient. Saya tahu itu bisa dimatikan dengan
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>
(ditemukan di http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )
Tapi bagaimana saya bisa melakukannya secara terprogram?
Sesuai dengan http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"Mengubah properti DefaultConnectionLimit tidak berpengaruh pada objek ServicePoint yang ada; ini hanya memengaruhi objek ServicePoint yang diinisialisasi setelah perubahan. Jika nilai properti ini belum disetel baik secara langsung atau melalui konfigurasi, nilai defaultnya ke default DefaultPersistentConnectionLimit."
Saya ingin yang terbaik untuk mengonfigurasi batas saat saya membuat instansi WebClient, tetapi menghapus batasan menyedihkan ini secara terprogram di awal program saya juga akan baik-baik saja.
Server yang saya akses bukanlah webserver biasa di internet, tetapi di bawah kendali saya dan di LAN lokal. Saya ingin melakukan panggilan API, tetapi saya tidak menggunakan layanan web atau remote
Jawaban:
Dengan beberapa tip dari sini dan di tempat lain, saya berhasil memperbaiki ini dalam aplikasi saya dengan menimpa kelas WebClient yang saya gunakan:
class AwesomeWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address); req.ServicePoint.ConnectionLimit = 10; return (WebRequest)req; } }
sumber
System.Net.ServicePointManager.DefaultConnectionLimit
adalah solusi yang lebih baik, karena tidak dapat berasumsi bahwa ituWebRequest
adalahHttpWebRequest
, misalnya, bisa jadi aFileRequest
.bagi yang berminat:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(di mana x adalah jumlah koneksi yang Anda inginkan)tidak perlu referensi tambahan
pastikan ini disebut SEBELUM titik layanan dibuat seperti yang disebutkan di atas di pos.
sumber
Solusi ini memungkinkan Anda untuk mengubah batas koneksi kapan saja :
private static void ConfigureServicePoint(Uri uri) { var servicePoint = ServicePointManager.FindServicePoint(uri); // Increase the number of TCP connections from the default (2) servicePoint.ConnectionLimit = 40; }
Pertama kali seseorang memanggil FindServicePoint ini , instance ServicePoint dibuat dan WeakReference dibuat untuk menyimpannya di dalam ServicePointManager . Permintaan berikutnya ke pengelola untuk Uri yang sama mengembalikan instance yang sama. Jika koneksi tidak digunakan setelahnya, GC akan membersihkannya.
sumber
ServicePoint
hilang (bersama dengan pengaturan Anda) setelahMaxIdleTime
Jika Anda menemukan objek ServicePoint sedang digunakan oleh Klien Web Anda, Anda bisa mengubah batas koneksinya. Objek HttpWebRequest memiliki aksesor untuk mengambil objek yang mereka buat untuk digunakan, sehingga Anda dapat melakukannya dengan cara itu. Jika Anda beruntung, semua permintaan Anda mungkin akan berbagi ServicePoint yang sama sehingga Anda hanya perlu melakukannya sekali.
Saya tidak tahu cara global apa pun untuk mengubah batas. Jika Anda mengubah DefaultConnectionLimit cukup awal dalam eksekusi, Anda mungkin baik-baik saja.
Bergantian, Anda bisa hidup dengan batas koneksi, karena sebagian besar perangkat lunak server akan menghambat Anda. :)
sumber
Kami memiliki situasi mengenai bagian konfigurasi di atas di App.Config
Agar ini berlaku dalam Aplikasi CONSOLE, kami menambahkan referensi System.Configuration dll. Tanpa referensi, hal di atas tidak berguna.
sumber