【问题标题】:Hosting a WCF service from within a Windows Service. cannot be reached从 Windows 服务中托管 WCF 服务。无法连接
【发布时间】:2013-08-29 11:34:39
【问题描述】:

所以我有一个 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");
    }
}

【问题讨论】:

  • 你确定你没有吞下异常?你记录了所有的catch 块吗?检查catch 语句的托管代码。如果它的权限,你会得到一个例外。我会先添加日志记录并勾选功能块,然后通过逐行跟踪日志确定它。或者如果可以的话,附加调试器。
  • 不幸的是,我无法附加安装在远程机器上的调试器,而我没有权限...确切地...我将放置一些我认为如何捕获异常的代码。但感谢您的建议

标签: c# wcf windows-services self-hosting


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多