Кэширование в WCF?

Документация Chrome дает вам хорошую отправную точку: https://developer.chrome.com/extensions/content_scripts#host-page-communication

Этот метод позволяет вам извлечь Глобальная переменная страницы в вашем скрипте контента. Он также использует идею, чтобы принимать только входящие сообщения, которые вы узнаете, учитывая ваше рукопожатие. Вы также можете просто использовать Math.random() для рукопожатия, но мне было весело.

Объяснение

  1. Этот метод создает тег сценария
  2. Он переводит в строку функцию propagateVariable и передает текущее handShake и имя целевой переменной в строку для сохранения, так как функция будет не имеют доступа к нашей области содержимого скрипта.
  3. Затем он вставляет этот тег сценария на страницу.
  4. Затем мы создаем слушателя в нашем скрипте контента, ожидая ответа от страницы, чтобы передать переменную, которую мы ищем.
  5. К настоящему времени введённый скрипт попал на страницу.
  6. Внедренный код был обернут в IIFE , поэтому он сам запускает передачу данных слушателю.
  7. Необязательно: слушатель проверяет, что у него было правильное рукопожатие, и вуаля, мы можем доверять источнику данных (на самом деле это не безопасно, но в этом случае помогает создать идентификатор, который дает нам некоторый уровень доверия).

Раунд 1

v1.0

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);

v1.1 с обещанием!

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
});

Раунд 2 - Класс & amp; Promises

v2.0

Я бы порекомендовал добавить класс в его собственный файл и экспортировать его по умолчанию, если используются модули es. Тогда это просто становится:

ExtractPageVariable('someGlobalPageVariable').data.then(pageVar => {
  // Do work here 

42
задан Sildoreth 6 April 2015 в 21:26
поделиться

4 ответа

Вы можете взглянуть на Скорость . Это распределенная структура кэширования в памяти Microsoft . Но это может быть чересчур бета ...

1
ответ дан 26 November 2019 в 23:53
поделиться

Есть много способов сделать это. Достаточно просто разместить объект System.Web.Cache самостоятельно и использовать его для хранения справочных данных. Здесь есть хороший пример: http://kjellsj.blogspot.com/2007/11/wcf-caching-claims-using.html

0
ответ дан 26 November 2019 в 23:53
поделиться

В WCF REST Starter Kit есть кэширование, вот статья об его использовании ... с образцом кода.

http://weblogs.asp.net/gsusx/archive/2008 /10/29/adding-caching-to-wcf-restful-services-using-the-rest-starter-kit.aspx

0
ответ дан 26 November 2019 в 23:53
поделиться

Вы можете использовать System.Web.Cache (даже если вы не находитесь в веб-контексте), и я бы это сделал. По сути, это большая хеш-таблица в памяти с некоторыми тонкостями для устаревшего содержимого.

0
ответ дан 26 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

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