Запуск внешнего wcf сервиса на ASP.NET CORE

411
21 декабря 2017, 22:57

Доброго времени суток. Имеется некий внешний WCF сервис располагающийся по адресу:

https://cunaexchengetest.azurewebsites.net/Service1.svc 

С помощью Microsoft WCF Web Service Reference Provider я добавил его ссылку в проект ASP.NET Core.

Суть вопроса в том, что при запуске ASP.NET Core сервера необходимо запустить функционал, который раз в 6 секунд будет вызывать определенный метод вышеуказанного WCF сервиса.

Логику придумал такую:

1.Создал внутренний сервис

--Итерфейс

public interface ICunaLoader
{
   void LoadData();
}

--Его реализация

   public class CunaLoader:ICunaLoader
    {
        Service1Client service = new Service1Client();//объект WCF сервиса
        TimerCallback tm;
        public CunaLoader()
        {
            // устанавливаем метод обратного вызова
            tm = new TimerCallback(Load);            
        }
        public void LoadData()
        {
            // создаем таймер
            Timer timer = new Timer(tm, service, 0, 6000);
        }
        private static void Load(object obj)
        {
            var service1 = obj as Service1Client;
            service1.LoadTradeLinesAsync();
        }
    }

2.В классу Startup.cs добавил этот внутренний сервис в метод ConfigureServices

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
   services.AddMvc();
   services.AddTransient<ICunaLoader, CunaLoader>();
}

Вопрос!!! Как мне теперь добавить этот внутренний сервис (вернее запуск его метода LoadData()) в конвейер обработки запросов ASP.NET Core сервера?

Answer 1

Спасибо @tym32167 - показал в какую сторону двигаться. Значит оставил только инстанс без всяких интерфейсов:

public class CunaLoader
    {
        private static CunaLoader instance;
        private Timer Timer { get; set;}
        private TimerCallback TmCallbck { get; set; }
        private Service1Client CunaService { get; set; }
        private static object syncRoot = new Object();

        protected CunaLoader(Service1Client cunaServise)
        {
            CunaService = cunaServise;
            TmCallbck = new TimerCallback(Load);
            Timer = new Timer(TmCallbck, CunaService, 0, 6000);
        }
        public static CunaLoader GetCunaLoader(Service1Client cunaServise)
        {
            if (instance == null)
            {
                lock(syncRoot)
                {
                    if (instance == null) instance = new CunaDbLoader(cunaServise);
                }
            }
            return instance;
        }
        private static void Load(object obj)
        {
            (obj as Service1Client).LoadTradeLinesAsync();
        }
    }

Далее в конструкторе класса Startup() сервера запустил синглтон.

public class Startup
    {
        Service1Client cunaServise = new Service1Client();
        public Startup()
        {
            CunaLoader.GetCunaLoader(cunaServise);
        }
    }

Все заработало как и предпологалось с частотой в 6 секунд.

READ ALSO
Какой использовать контрол для хелпа?

Какой использовать контрол для хелпа?

На форме необходимо разместить небольшой хелп с описанием параметров и примерамиКакой есть контрол, чтобы я мог поместить описание параметров...

281
Обновление ComboBoxItem при нажатии на ToggleButton

Обновление ComboBoxItem при нажатии на ToggleButton

Имеется ComboBox, в котором хранится список доступных портовНа данный момент для обновления используется отдельная кнопка

221
Как войти в систему с помощью запроса?

Как войти в систему с помощью запроса?

Существует форма для ввода логина и пароляКак можно войти в систему, не вводя логин и пароль (передавая их другим образом)?

217