Как получить доступ к содержимому файла из C # HTTPWebRequest с AutoRedirect - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь вызвать URL, который должен вернуть токен аутентификации. Данные публикуются по URL-адресу, и после ряда перенаправлений возвращает объект JSON с токеном. Я использую C # и WPF.

Вот выдержка из того, что я делаю:

            HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(action);
            request1.Method = "POST";

            StringBuilder sb = new StringBuilder();
            String boundary = "-----------------------------1721856231228";
            foreach (elem in elems)
            {
                String nameStr = elem.GetAttribute("name");
                if (nameStr != null && nameStr.Length != 0)
                {
                    String valueStr = elem.GetAttribute("value");
                    sb.Append("\r\n" + boundary + "\r\n");
                    sb.Append("Content-Disposition: form-data; name=\"" + nameStr + "\"" + "\r\n");
                    sb.Append("\r\n");
                    sb.Append(valueStr);
                }
            }
            sb.Append("\r\n--" + boundary + "--" + "\r\n");
            String postData1 = sb.ToString();
            request1.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3";
            request1.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36";
            request1.ContentType = "application/x-www-form-urlencoded; boundary=" + boundary;
            request1.ContentLength = postData1.Length;
            request1.KeepAlive = true;
            request1.AllowAutoRedirect = true;

            StreamWriter w = new StreamWriter(request1.GetRequestStream());
            w.Write(postData1);
            w.Close();

            HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse();
            StreamReader reader1 = new StreamReader(response1.GetResponseStream());
            String responseText1 = reader1.ReadToEnd();
            reader1.Close();
            response1.Close();

Но ответ не содержит JSON с токеном. Я использую Fiddler и могу сделать паузу в конце приведенного выше кода, и URI, который должен иметь JSON, не был вызван. Я могу продолжить выполнение другого кода в отладчике, а затем Fiddler покажет URI как вызванный, и всплывающее окно File Download позволяет мне затем загрузить JSON-файл, который содержит токен. Мне не нужно всплывающее окно, и я хочу иметь возможность программно собирать данные JSON.

Я обнаружил, добавив следующую строку в конец кода выше и просто выполнив эту строку в отладчике,что Fiddler сообщит, что URL токена был вызван (и я вижу в Fiddler правильный ответ JSON):

            System.Windows.Forms.Application.DoEvents();

Но я не знаю, как получить доступ к этому ответу или как замкнуть накоротковсплывающее окно загрузки файла не происходит.

Может быть, что-то в настройке KeepAlive поможет?

1 Ответ

0 голосов
/ 09 октября 2019

попробуйте newtonsoft для чтения с помощью Newtonsoft.Json

TokenModel tokenModel;

StreamReader reader1 = new StreamReader(response1.GetResponseStream());
using (JsonTextReader reader = new JsonTextReader(reader1))
{    
 tokenModel = serializer.Deserialize<TokenModel>(reader);
}

Ссылка: https://www.newtonsoft.com/json/help/html/ReadJson.htm

Или вы можете использовать следующий полный запрос с ответом с помощью HttpClient

        var client = new HttpClient();
        client.BaseAddress = new Uri("your url");
        int _TimeoutSec = 90;
        client.Timeout = new TimeSpan(0, 0, _TimeoutSec);
        string _ContentType = "application/x-www-form-urlencoded";            
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_ContentType));

       //if you have any content to send use following keyValuePair

        var kv = new List<KeyValuePair<string, string>>();
        kv.Add(new KeyValuePair<string, string>("key1", "value"));
        kv.Add(new KeyValuePair<string, string>("key2", "value"));


        var req = new HttpRequestMessage(System.Net.Http.HttpMethod.Post, "your url") { Content = new FormUrlEncodedContent(kv) };
        var responseAsyn = client.SendAsync(req);
        var response = responseAsyn.GetAwaiter().GetResult();

        TokenModel tokenResponse = new TokenModel();
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            var responseString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
            tokenResponse = JsonConvert.DeserializeObject<TokenModel>(responseString);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...