Размещение службы WCF из службы Windows. недоступен

Итак, у меня есть служба Windows, работающая как локальная система.

затем эта служба Windows запускает службу WCF.

С моей машины проблем нет, все работает нормально.
Из тестового консольного приложения на целевой машине работает нормально
Из службы Windows на целевой машине не работает. И не выбрасывает исключения...

Я действительно застрял на этом. :(

Может это разрешения?

m_tknCancelToken = new CancellationTokenSource();

/**************************************************************************************/
/***  Create and start the task                                                     ***/
/**************************************************************************************/

m_tskService = Task.Factory.StartNew((object o) => 
{
    RunService();
}, 
m_tknCancelToken);

/**************************************************************************************/
/***  Set the handler when the task is cancelled or faulted                         ***/
/**************************************************************************************/

m_tskService.ContinueWith(
    TaskEndedHandler, 
    TaskContinuationOptions.OnlyOnFaulted);

m_tskService.ContinueWith(
    TaskEndedHandler,
    TaskContinuationOptions.OnlyOnCanceled);

а потом ловить ошибки.

private void TaskEndedHandler(Task tskTask)
{
    Log.Log(String.Format("{0} has ended", ServiceName), "WHS010CI");

    if (tskTask.Exception != null)
    {
        Log.LogEx(tskTask.Exception, "WHS0103E");

        if (tskTask.Exception.InnerExceptions != null)
        {
            foreach (Exception ex in tskTask.Exception.InnerExceptions)
            {
                Log.LogEx(ex, "WHS0104E");
            }
        }
    }

    if(tskTask.IsCanceled)
    {
        Log.Log(String.Format("[{0}] has been cancelled", ServiceName), "WHS0104W");
    }
}

person Secret Squirrel    schedule 29.08.2013    source источник
comment
Вы уверены, что не проглотите исключение? Вы регистрируете все блоки catch? Проверьте свой код хостинга на наличие операторов catch. Если это разрешения, вы получите исключение. Я бы сначала добавил ведение журнала и отметил блоки функциональности, а затем закрепил бы это построчными журналами трассировки. Или прикрепите отладчик, если можете.   -  person oleksii    schedule 29.08.2013
comment
к сожалению, я не могу подключить отладчик, он установлен на удаленной машине, на которую у меня нет разрешений... точно... Я размещу код того, как, по моему мнению, я перехватываю исключения. но спасибо за совет   -  person Secret Squirrel    schedule 29.08.2013


Ответы (1)


Как обычно, это была глупая ошибка.

В моем консольном приложении я привязывал SSL-сертификат к порту, это было удалено, так как власть предержащие не хотели этого в производственном коде, что понятно. Поэтому я удалил его, чтобы иметь отдельный пакетный файл или что-то еще, которое нужно запускать вручную... однако это то, что я забыл сделать. :(

для тех, кто заинтересован, ниже приведен код из моего тестового приложения.

process = new Process();
process.StartInfo = BindCertToPort(port, certificate);
process.Start();

метод:

private static ProcessStartInfo BindCertToPort(int iPort, X509Certificate2 certificate, bool bRemove = false)
{
    string strAction = null;
    string strExtraArguments = null;

    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "netsh.exe");

    if (bRemove)
    {
        strAction = "delete";
    }
    else
    {
        strAction = "add";
        strExtraArguments = string.Format(" certhash={0} appid={{{1}}}", certificate.Thumbprint, Guid.NewGuid());
    }

    startInfo.Arguments = string.Format("http {0} sslcert ipport=0.0.0.0:{1}{2}", strAction, iPort, strExtraArguments);
    startInfo.RedirectStandardOutput = true;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;

    return startInfo;
}
person Secret Squirrel    schedule 29.08.2013