Служба c # 4.0 в качестве клиента для подключения концентратора сигналов (1.2.2) - PullRequest
0 голосов
/ 27 апреля 2018

Я считаю серверный класс DLTransMonCore.cs с использованием C # .Net 4.0.

DLTransMonCore.cs в проекте DLTransMonCore DLL

public void MonStart() {
    var client = new WebSignalrClient();
    client.HubUrl = "http://10.20.30.40/MyApp";
    client.HubName = "MyAppHub";
    client.InitialSignalrHub();
}

WebSignalrClient.cs в проекте DLL WebSignalrClient

public string HubUrl;
public string HubName;
public void InitialSignalrHub() {
    var hubConnection = new HubConnection(HubUrl);
    var hubProxy = hubConnection.CreateHubProxy(HubName);
    hubConnection.Start().Wait();
}

Этот сервер будет подключаться к веб-сайту с помощью сигнализатора (1.2.2). И слушайте, некоторые порты используют сокет как сервер сокетов.


1-й сценарий,
Я использую консольное приложение ( Program.cs ), чтобы создать экземпляр класса DLTransMonCore и запустить его.
Все отлично работает.

Program.cs

static void Main(string[] args) {
    var core = new DLTransMonCore();
    core.MonStart();
    Console.Readkey();
}


2-й сценарий,
Я создаю службы Windows ( Service1.cs ) для экземпляра класса DLTransMonCore и запускаю его. Когда я пытаюсь запустить «Service1» в службах Windows, «Service1» запускается примерно на 10 секунд, а затем автоматически останавливается Windows.

Service1.cs

protected override void OnStart(string[] args) {
    var core = new DLTransMonCore();
    core.MonStart();
}

Я написал файл журнала, чтобы определить, какая строка была выполнена последним:
hubConnection.Start (). Wait (); (в WebSignalrClient.cs),
и он никогда не достигнет следующей строки.


3-й сценарий,
Я создаю другую службу Windows ( Service2.cs ) для экземпляра WebSignalrClient напрямую. И этот «Сервис2» стартовал успешно. (hubConnection.Start (). Wait (); успешно выполнен и достигает следующей строки)

Service2.cs

protected override void OnStart(string[] args) {
    var client = new WebSignalrClient();
    client.HubUrl = "http://10.20.30.40/MyApp";
    client.HubName = "MyAppHub";
    client.InitialSignalrHub();
}

Почему Service1 будет неудачным, а Service2 успешным?

Любой комментарий будет оценен!

Edit:
Описание этого поста упрощено из моего "Оригинального решения". Оригинальное решение имеет множество моделей, репозиториев, интерфейсов, утилит, расширений, проектов ... и т. Д.
Поэтому я должен упростить это, чтобы описать мою проблему.


Но я только что создал другое «Новое решение» с минимизированным кодом для тестирования Scenario2 и Scenario3.

Тогда я обнаружил, что «Новое решение» сработало. Это действительно беспокоит меня ...
Теперь я должен повторно протестировать и просмотреть свой код в «Исходном решении».

Но если у вас есть какие-либо предложения или комментарии, пожалуйста, оставьте комментарий.
Спасибо!

Редактировать 2:
Дорогие все, этот шаблон не проблема.
Я нашел свою проблему в «Первоначальном решении».

Проблема: NullReferenceException.
Причина в том, что когда Windows запускает Службу, рабочий каталог НЕ , где существовал ваш Service.exe.

В моем решении у меня есть файл конфигурации для настройки в расположении этой службы. И Сервис получит конфигурацию, используя имя файла напрямую. Затем служба получит нулевой объект, и при запуске службы будет пытаться получить доступ к конфигурации при появлении NullReferenceException.

1 Ответ

0 голосов
/ 27 апреля 2018

Я не могу объяснить, почему, но у меня возникла та же проблема, что и для самостоятельного размещения сервера с использованием службы Windows, и я так и не понял, почему он настолько нестабилен, что я могу предложить, это использовать собственный хост Owin, когда я переключился на него используя signalR, и это намного надежнее, чем служба Windows.

...