Как захватить ответ 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;
}