Документация Chrome дает вам хорошую отправную точку: https://developer.chrome.com/extensions/content_scripts#host-page-communication
Этот метод позволяет вам извлечь Глобальная переменная страницы в вашем скрипте контента. Он также использует идею, чтобы принимать только входящие сообщения, которые вы узнаете, учитывая ваше рукопожатие. Вы также можете просто использовать Math.random()
для рукопожатия, но мне было весело.
propagateVariable
и передает текущее handShake и имя целевой переменной в строку для сохранения, так как функция будет не имеют доступа к нашей области содержимого скрипта.
const globalToExtract = 'someVariableName';
const array = new Uint32Array(5);
const handShake = window.crypto.getRandomValues(array).toString();
function propagateVariable(handShake, variableName) {
const message = { handShake };
message[variableName] = window[variableName];
window.postMessage(message, "*");
}
(function injectPropagator() {
const script = `( ${propagateVariable.toString()} )('${handShake}', '${globalToExtract}');`
const scriptTag = document.createElement('script');
const scriptBody = document.createTextNode(script);
scriptTag.id = 'chromeExtensionDataPropagator';
scriptTag.appendChild(scriptBody);
document.body.append(scriptTag);
})();
window.addEventListener("message", function({data}) {
console.log("INCOMINGGGG!", data);
// We only accept messages from ourselves
if (data.handShake != handShake) return;
console.log("Content script received: ", data);
}, false);
function extractGlobal(variableName) {
const array = new Uint32Array(5);
const handShake = window.crypto.getRandomValues(array).toString();
function propagateVariable(handShake, variableName) {
const message = { handShake };
message[variableName] = window[variableName];
window.postMessage(message, "*");
}
(function injectPropagator() {
const script = `( ${propagateVariable.toString()} )('${handShake}', '${variableName}');`
const scriptTag = document.createElement('script');
const scriptBody = document.createTextNode(script);
scriptTag.id = 'chromeExtensionDataPropagator';
scriptTag.appendChild(scriptBody);
document.body.append(scriptTag);
})();
return new Promise(resolve => {
window.addEventListener("message", function({data}) {
// We only accept messages from ourselves
if (data.handShake != handShake) return;
resolve(data);
}, false);
});
}
extractGlobal('someVariableName').then(data => {
// Do Work Here
});
Я бы порекомендовал добавить класс в его собственный файл и экспортировать его по умолчанию, если используются модули es. Тогда это просто становится:
ExtractPageVariable('someGlobalPageVariable').data.then(pageVar => {
// Do work here
Вы можете взглянуть на Скорость . Это распределенная структура кэширования в памяти Microsoft . Но это может быть чересчур бета ...
Есть много способов сделать это. Достаточно просто разместить объект System.Web.Cache самостоятельно и использовать его для хранения справочных данных. Здесь есть хороший пример: http://kjellsj.blogspot.com/2007/11/wcf-caching-claims-using.html
В WCF REST Starter Kit есть кэширование, вот статья об его использовании ... с образцом кода.
Вы можете использовать System.Web.Cache (даже если вы не находитесь в веб-контексте), и я бы это сделал. По сути, это большая хеш-таблица в памяти с некоторыми тонкостями для устаревшего содержимого.