Как определить, размещена ли служба WCF в консольном приложении?

У меня есть служба WCF в стадии разработки, и я часто переключаюсь между размещением в службе Windows и размещением в консольном приложении. Служба и консольное приложение совместно используют один файл конфигурации, так как еще я могу определить в моем клиенте WPF, размещена ли служба в консольном приложении?


person ProfK    schedule 08.03.2015    source источник
comment
Сам сервис WCF знает только о своем ServiceHost, но не о среде, в которой существует ServiceHost... Я не думаю, что есть что-то нестандартное, чтобы различать это. А зачем тебе это вообще?? Если вы абсолютно должны иметь эту функцию, я думаю, вам придется создать потомка ServiceHost, по которому вы сможете определить, работает ли он в консольном приложении или службе Windows....   -  person marc_s    schedule 08.03.2015
comment
Клиентское приложение WPF делает слишком много предположений о том, что WCF размещается в службе Windows. В качестве компромисса во время разработки и отладки я хочу проверить тип хоста и обойти доступ к службе Windows. я буду довольно сильно пересматривать клиентское приложение, но моим абсолютным приоритетом является тестирование и отладка самого WCF. Клиентское приложение имеет довольно низкий приоритет: если я могу запустить службу Windows и WCF спокойно работает в этой службе, я могу предоставить своему клиенту просроченную тестовую версию на месте. Потомок или расширение сервисного хоста занимает первое место в моем списке лучших, но долгосрочных решений.   -  person ProfK    schedule 08.03.2015
comment
На данный момент я проверяю, установлена ​​ли и включена ли служба Windows, и если нет, я не делаю с ней ничего общего. Затем, если мой wcf все еще работает, это означает, что моя консоль размещена. Я чувствую себя грязным.   -  person ProfK    schedule 08.03.2015


Ответы (1)


bool windowsServiceHosted = !Environment.UserInteractive;

Более хакерский (не обязательно выше, должно работать)

private bool? _ConsolePresent;
public bool ConsolePresent {
    get {
        if (_ConsolePresent == null) {
            _ConsolePresent = true;
            try { int window_height = Console.WindowHeight; }
            catch { _ConsolePresent = false; }
        }
        return _ConsolePresent.Value;
    }
}

bool windowsServiceHosted = !ConsolePresent;

Если вам нужно узнать от клиента, вам нужно будет предоставить свойство bool WindowServicesHosted с вашего сервера, которое использует одну из указанных выше серверных сторон.

person Ricibob    schedule 09.03.2015
comment
Хороший хак с WindowHeight. Но разве !Environment.UserInteractive не вернет true для других неинтерактивных хостов, таких как IIS? - person ProfK; 09.03.2015
comment
Хороший вопрос! Я лично не тестировал IIS, но эта ссылка предполагает, что хостинг IIS вернет false для Enviroment.UserInteractive. social.microsoft.com/Forums/en-US/ - person Ricibob; 09.03.2015