UserInfo في عنوان URL للوكيل ليس WebProxy.Credentials
استخرج معلومات المستخدم من معرّف URI لوكيل HTTP وفكّ ترميزها قبل إنشاء NetworkCredential.
مُنشئ URI في WebProxy يختار نقطة نهاية فقط، ولا يملأ Credentials من معلومات المستخدم في ذلك URI. لعنوان URL لوكيل HTTP يتم التحقق منه على مستوى التطبيق:
var uri = new Uri(proxyUrl);
var endpoint = new UriBuilder(uri)
{
UserName = "",
Password = ""
};
var proxy = new System.Net.WebProxy(endpoint.Uri);
if (uri.UserInfo.Length > 0)
{
var parts = uri.UserInfo.Split(new[] { ':' }, 2);
var username = Uri.UnescapeDataString(parts[0]);
var password = parts.Length == 2
? Uri.UnescapeDataString(parts[1])
: "";
proxy.Credentials =
new System.Net.NetworkCredential(username, password);
}
proxyUrl هو عنوان URL للوكيل المقدَّم، وليس عنوان الموقع. يحلّل Uri الجزء authority، بينما يزيل UriBuilder معلومات المستخدم من نقطة النهاية المخزَّنة في WebProxy.
اقسم عند أول نقطتين حرفيتين قبل فك ترميز المكوّنات. يحافظ ذلك على نقطتين مُرمَّزتين داخل اسم المستخدم ويُبقي النقطتين الإضافيتين لكلمة المرور داخل كلمة المرور. فكّ ترميز كل مكوّن مرة واحدة؛ لا ترمّز كلمة المرور بـ Base64 بديلاً عن تهريب URL.
أخيرًا، عيّن proxy للمعالج HTTP المقصود قبل أن يبدأ ذلك المعالج بإرسال الطلبات. إنشاء الكائن وحده لا يغيّر سياسة التوجيه لدى عميل آخر.