Выполнение кода JavaScript в фоновом режиме в веб-приложении MVC - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть сценарий, который в основном выглядит следующим образом:

<script>
// Send transaction data with a pageview if available
// when the page loads. Otherwise, use an event when the transaction
// data becomes available.
dataLayer.push({
  'ecommerce': {
    'purchase': {
      'actionField': {
        'id': 'T12345',                         // Transaction ID. Required for purchases and refunds.
        'affiliation': 'Online Store',
        'revenue': '35.43',                     // Total transaction value (incl. tax and shipping)
        'tax':'4.90',
        'shipping': '5.99',
        'coupon': 'SUMMER_SALE'
      },
      'products': [{                            // List of productFieldObjects.
        'name': 'Triblend Android T-Shirt',     // Name or ID is required.
        'id': '12345',
        'price': '15.25',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Gray',
        'quantity': 1,
        'coupon': ''                            // Optional fields may be omitted or set to empty string.
       },
       {
        'name': 'Donut Friday Scented T-Shirt',
        'id': '67890',
        'price': '33.75',
        'brand': 'Google',
        'category': 'Apparel',
        'variant': 'Black',
        'quantity': 1
       }]
    }
  }
});
</script>

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

Ссылка на API:

https://developers.google.com/tag-manager/enhanced-ecommerce#purchases

Интересующая меня часть:

Измерение покупок

По сути, так как я не могнайти какую-либо реализацию для C # или PHP Я решил пойти по этому пути с выполнением JavaScript в фоновом режиме ...

То, что я думал, это может выглядеть так:

private void ExecuteMyScript(){
// Now to execute the script above ...
}

Этот методбудет запускаться запланированной задачей каждые 4 часа.

Это возможно в .NET MVC?Это первый раз, когда я сталкиваюсь с чем-то подобным, поэтому любая помощь и совет будут более чем приветствоваться.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Это, конечно, возможно, и у вас есть много вариантов ... видя, что вы используете ASP.NET MVC , я предполагаю, что вы используете ОС Windows.Вы можете создать службу Windows и выполнять запланированное задание каждые 4 часа ...

В случае моего приложения (что также происходит с веб-сайтом электронной коммерции) я написал службу Windows, используя Верхняя полка , которая запускается каждые 5 минут ... но вам не нужно использовать верхнюю полку для написания службы Windows, вы можете просто создать приложение службы Windows

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

0 голосов
/ 28 февраля 2019

Либо вы делаете повторение со стороны клиента, используя Java Script setInterval().Например,

setInterval(
    function(){ 
        alert("Hello World"); // Replace this line with your code that you want to repeat every 3 seconds.
    }, 
    3000
);

Или вы реализуете запланированное задание на своей стороне и реализуете шаблон подписки на публикацию.Где ваш Java Script подписывается на запланированную трансляцию с вашего сервера с помощью функции обратного вызова.Есть много способов, если вы ищете это, и я не знаю, что рекомендовать, потому что я сам не пробовал.См. SignalR, WebSockets и тому подобное для реализации «живых» / «подписываемых» конечных точек API.Я могу предоставить вам только псевдокод, чтобы рассказать об этой идее.

// C# backend part
namespace ScheduledTask
{
    public class NotificationTask
    {
        // Some kind of an event emitter class
        public Event notificationEvent; 
        // Some kind of Scheduler/Timer class library
        private ScheduleTimer scheduler;

        // Run()
        public void Run(IScheduledTask sheduledTask)
        {
            scheduler.start(timeout);
        }

        // timeout()
        private void timeout(data)
        {
            // emit event / notify
            notificationEvent.broadcast(data);
        }
    }
}


// JavaScript frontend part
// Subscribe to endpoint
api('/notification/id=1').subscribe(function(notification){
    // Do something with data received
});
...