Как захватить ответ JSON с помощью элемента управления WebBrowser

I POST на веб-сайт URL-адрес ответа JSON с помощью WebBrowser.Navigate().

Все идет хорошо, включая вызывающий обработчик webBrowser1_DocumentCompleted().

Но вместо получения "тихого" ответа (например, webBrowser1.Document), который я могу обрабатывать программно, я получаю диалоговое окно "Загрузка файла":

enter image description here

Если я нажму кнопку Save, а затем просмотрю файл, он будет содержать точно ответ JSON, который я ожидаю.

Но я хочу, чтобы программа захватила этот JSON-ответ внутри кода, не отображая это диалоговое окно и нажав кнопку Save.

Как захватить ответ JSON с помощью элемента управления WebBrowser?

Примечание: перед отправкой этого вопроса я искал SO, и все, что я нашел, было аналогичным вопросом, для которого принятый ответ действительно не объясняет, как это сделать (я уже обрабатываю webBrowser1_DocumentCompleted). Любые советы?

Обновление:. Все мои поисковые запросы до сих пор ничего не дали в отношении использования элемента управления WebBrowser для получения ответов JSON. Возможно, я приближаюсь к этому совершенно неправильно? Что мне не хватает?

Ответы

Ответ 1

Не используйте WebBrowser для связи JSON. Вместо этого используйте WebRequest:

//
//    EXAMPLE OF LOGIN REQUEST 
//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("http://getting-started.postaffiliatepro.com/scripts/server.php");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            //WRITE JSON DATA TO VARIABLE D
            string postData = "D={\"requests\":[{\"C\":\"Gpf_Auth_Service\", \"M\":\"authenticate\", \"fields\":[[\"name\",\"value\"],[\"Id\",\"\"],[\"username\",\"[email protected]\"],[\"password\",\"ab9ce908\"],[\"rememberMe\",\"Y\"],[\"language\",\"en-US\"],[\"roleType\",\"M\"]]}],  \"C\":\"Gpf_Rpc_Server\", \"M\":\"run\"}";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/x-www-form-urlencoded";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
//            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();


        }
    }
}

Вы можете найти более подробную информацию в этой связи С#.NET со статьей API и этой теме.

Ответ 2

У меня такая же проблема, как у Scatmoi, но я не могу использовать веб-запрос из-за требований входа. Я попытался изменить ответ выше, чтобы узнать, могу ли я пройти аутентификацию входа, но не повезло.

-update -

Я нашел решение, которое будет работать для меня. Дополнительную информацию см. В следующей ссылке, но на всякий случай я вставил здесь ответ. http://www.codeproject.com/Tips/216175/View-JSON-in-Internet-Explorer

Нужно ли просматривать ответы JSON в IE? 1. Откройте "Блокнот" и вставьте следующее:

Windows Registry Editor Version 5.00;
; Tell IE 7,8,9,10 to open JSON documents in the browser on Windows XP and later.
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;
[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

2. Сохраните документ как IE-Json.reg, а затем запустите его.

Примечание. Это было протестировано в Windows XP и Windows 7 с использованием IE 7, 8, 9, 10.

Ответ 3

В решении не хватало двух вещей, и ниже код должен работать в любой ситуации:

Windows Registry Editor Version 5.00
;
; Tell IE to open JSON documents in the browser.  
; 25336920-03F9-11cf-8FD0-00AA00686F13 is the CLSID for the "Browse in place" .
;  

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\application/x-json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

[HKEY_CLASSES_ROOT\MIME\Database\Content Type\text/json]
"CLSID"="{25336920-03F9-11cf-8FD0-00AA00686F13}"
"Encoding"=hex:08,00,00,00

Просто сохраните файл json.reg и запустите, чтобы изменить свой реестр.

Ответ 4

В качестве расширения для gadildafissh и Tomasz Maj awnser это можно сделать программно. Есть только один недостаток, это должно быть сделано с правами администратора. Мой пример для 32-битного приложения на 64-битном устройстве.

   private bool SetRegistery()
    {
        try
        {
            using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64))
            {
                using (RegistryKey key = hklm.OpenSubKey(@"MIME\Database\Content Type\application/json", true))
                {
                    if (key != null)
                    {
                        key.SetValue("CLSID", "{25336920-03F9-11cf-8FD0-00AA00686F13}");
                        key.SetValue("Encoding", new byte[] { 0x80, 0x00, 0x00, 0x00 });
                    }
                }
            }
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        return false;
    }