HttpWebRequest получить несанкционированное исключение - PullRequest
1 голос
/ 14 февраля 2020

При попытке вызвать удаленный сервер, используя следующий код, я всегда получаю несанкционированное исключение с сервера:

HttpWebRequest webRequest;
var myURI = "https://myURI";
webRequest = (HttpWebRequest)WebRequest.Create(myURI);

webRequest.Method = "GET";

string myCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("myUsername" + ":" + "myPassword"));
webRequest.Headers.Add("Authorization", "Basic " + myCredentials);

HttpWebResponse webResponse;
webResponse = (HttpWebResponse)webRequest.GetResponse();

string response = string.Empty;

using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
{
    response = sr.ReadToEnd();
    sr.Close();
}

Система. Net .WebException: 'Удаленный сервер возвратил ошибку : (401) Не авторизовано. '

WWW-Authenticate: Basi c realm = "геосервер"

Cache-Control: proxy-revalidate

Соединение: Keep-Alive

Set-Cook ie: BCSI-CS - ********** = 1; Путь = /

Поддержка прокси: аутентификация на основе сеанса

Тип содержимого: текст / обычный; charset = UTF-8

Content-Length: 23

Это немного странно, потому что, если я пытаюсь (почти) то же самое через почтальона, это работает, и я получаю правильный ответ от удаленного сервера (без 401).

Я также пробовал другие способы, такие как следующий код, но ничего не помогает:

CredentialCache cc = new CredentialCache();
cc.Add(
new Uri("https://mywebserver/webpage"), 
"Basic",    //also tried NTLM
new NetworkCredential("user", "password"));
webRequest.Credentials = cc;

Если я пытаюсь вызвать другой сервер с таким же кодом работает.

1 Ответ

0 голосов
/ 17 февраля 2020

Как вы можете видеть в Исключении, имеет Session-based-аутентификацию. Проблема в том, что для обратного прокси-сервера нет документации, и я не могу найти конечную точку, чтобы получить чистый повар ie. В качестве обходного пути я попробовал fllowing код, и теперь он работает. Возможно, это не лучший способ установить Cook ie как HttpHeader.

    static void Main(string[] args)
    {
        HttpWebRequest webRequest = CreateWebRequest();
        string cookie = null;

        HttpWebResponse webResponse;
        try
        {
            webResponse = (HttpWebResponse) webRequest.GetResponse();
        }
        catch (WebException ex)
        {
            var headers = (WebHeaderCollection)ex.Response.GetType().GetProperty("Headers").GetValue(ex.Response, null);
            cookie = headers.Get("Set-Cookie");
            webRequest = CreateWebRequest();
            webRequest.Headers.Add("Cookie", cookie);
            webResponse = (HttpWebResponse) webRequest.GetResponse();
        }


        string response = string.Empty;

        using (StreamReader sr = new StreamReader(webResponse.GetResponseStream()))
        {
            response = sr.ReadToEnd();
            sr.Close();
        }
    }

    private static HttpWebRequest CreateWebRequest()
    {
        HttpWebRequest webRequest;
        var myURI = "https://myURI";
        webRequest = (HttpWebRequest)WebRequest.Create(myURI);
        webRequest.Method = "GET";
        string myCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("myUsername" + ":" + "myPassword"));
        webRequest.Headers.Add("Authorization", "Basic " + myCredentials);
        return webRequest;
    }
...