Клиент Github Api Rest c # [дубликат]

Поскольку я недавно прошел перчатку этой проблемы, я хочу поделиться некоторой информацией, которая мне кажется ценной.

Во-первых, ответ Роба верен. Тень DOM - правильное решение этой проблемы. Однако в моем случае мне не только нужна изоляция CSS, но также нужны события JavaScript. Например, что произойдет, если пользователь нажмет кнопку, которая живет в изолированном HTML? Это становится действительно уродливым только с Shadow DOM, но у нас есть другая технология веб-компонентов, Custom Elements, для спасения. За исключением того, что на момент написания этой статьи есть ошибка в chrome, которая предотвращает создание пользовательского элемента в chrome-расширениях. Здесь мои здесь и здесь и здесь есть ошибка .

Итак, где же это остается? Я считаю, что лучшим решением сегодня является IFrames, с которым я и пошел. Статья shahalpk связана велика, но она описывает только часть процесса. Вот как я это сделал:

Сначала создайте html-файл и js-файл для вашего изолированного виджета. Все внутри этих файлов будет работать в изолированной среде в iframe. Не забудьте загрузить файл js из html-файла.

//iframe.js
var button = document.querySelector('.my-button');
button.addEventListener('click', function() {
    // do useful things
});

//iframe.html


 

Затем внутри вашего скрипта содержимого создайте элемент iframe в javascript. Вам нужно сделать это в javascript, потому что вам нужно использовать chrome.extension.getURL, чтобы захватить ваш файл iframe html:

var iframe = document.createElement('iframe');
iframe.src = chrome.extension.getURL("iframe.html");
document.body.appendChild(iframe);

И все.

имейте в виду: если вам нужно обмениваться информацией между iframe и остальной частью сценария контента, вам нужно выполнить chrome.runtime.sendMessage () на фоновой странице, а затем chrome.tabs.sendMessage с фоновой страницы обратно на вкладку , Они не могут напрямую общаться.

EDIT: я написал сообщение в блоге, в котором подробно описывалось все, что я узнал в моем процессе, включая полное расширение chrome примера и множество ссылок на различную информацию:

https://anderspitman.net/blog/chrome-extension-content-script-stylesheet-isolation/

В случае, если мой блог не работает, вот источники исходного сообщения :

Запись в блоге

Пример источника

72
задан Luiso 12 July 2016 в 18:15
поделиться

1 ответ

Проверьте этот ответ на мой вопрос, который кажется очень похожим.

Что-то попробовать: вызвать ConfigureAwait(false) в Задаче, возвращенной GetStreamAsync(). Например,

var result = await httpClient.GetStreamAsync("weeklyplan")
                             .ConfigureAwait(continueOnCapturedContext:false);

Независимо от того, действительно ли это полезно, зависит от того, как вызывается этот код выше - в моем случае вызов метода async с использованием Task.GetAwaiter().GetResult() заставил код висеть.

Это связано с тем, что GetResult() блокирует текущий поток, пока задача не завершится. Когда задача завершается, он пытается повторно ввести контекст потока, в котором он был запущен, но не может, потому что в этом контексте уже есть поток, который блокируется вызовом GetResult() ... deadlock!

Эта запись MSDN подробно рассказывает о том, как .NET синхронизирует параллельные потоки, и ответ на мой собственный вопрос дает некоторые рекомендации.

104
ответ дан Community 20 August 2018 в 11:18
поделиться
  • 1
    Спасибо, почти отказался от async / await, прежде чем увидеть это. – Den 29 August 2013 в 17:32
  • 2
    Я тоже! Почему этот материал не задокументирован? еще раз спасибо – Avrohom Yisroel 2 November 2014 в 17:30
  • 3
    Это произойдет, если это не контекст пользовательского интерфейса и контекст ASP.NET? – machinarium 24 December 2015 в 10:32
  • 4
    Удивительный ответ! Но я смущен, почему до сих пор у меня только эта проблема при использовании HttpClient, похоже, что базовая реализация в HttpClient реализована неправильно. Другие обходные пути, которые я нашел, связаны с установкой текущего потока как STA, который помогает, но действительно является косвенным, особенно когда вы используете стороннюю сборку и не знаете, что под капотом какой-то вызов будет ждать определенно для ответа, что он никогда не получится. В моем случае dll была в доме, поэтому мы смогли ConfigureAwait ... но это нужно было сделать на самом низком уровне для объекта HttpClient obj. – Chris Schaller 31 May 2016 в 05:41
  • 5
    @ChrisSchaller Обязательно прочитайте полный ответ в stackoverflow.com/a/10351400/174735 , который достаточно подробно объясняет проблему. – Benjamin Fox 31 May 2016 в 05:59
Другие вопросы по тегам:

Похожие вопросы: