프록시 URL의 UserInfo는 WebProxy.Credentials가 아닙니다
NetworkCredential을 만들기 전에 HTTP 프록시 URI에서 사용자 정보를 추출하고 디코딩하세요.
WebProxy의 URI 생성자는 엔드포인트만 선택할 뿐, 그 URI의 사용자 정보로 Credentials를 채우지 않습니다. 애플리케이션에서 검증한 HTTP 프록시 URL의 경우:
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이며 웹사이트 URL이 아닙니다. Uri는 authority를 구문 분석하고, UriBuilder는 WebProxy에 저장되는 엔드포인트에서 사용자 정보를 제거합니다.
구성 요소를 디코딩하기 전에 첫 번째 문자 그대로의 콜론에서 나눕니다. 이렇게 하면 사용자 이름 안의 인코딩된 콜론이 유지되고 추가 비밀번호 콜론도 비밀번호 안에 남습니다. 각 구성 요소를 한 번만 디코딩하세요. 비밀번호를 Base64로 인코딩하여 URL 이스케이프를 대신하지 마세요.
마지막으로, 핸들러가 요청을 시작하기 전에 proxy를 의도한 HTTP 핸들러에 할당하세요. 객체를 만드는 것만으로는 다른 클라이언트의 라우팅 정책이 바뀌지 않습니다.