2013-08-29 4 views
0

로컬 시스템으로 실행중인 Windows 서비스가 있습니다.Windows 서비스 내에서 WCF 서비스 호스팅. 연결할 수 없습니다.

이 Windows 서비스는 WCF 서비스를 시작합니다.

내 컴퓨터에서 아무 문제없이 잘 작동합니다.
테스트 콘솔 응용 프로그램에서 대상 컴퓨터에서 제대로 작동합니다.
대상 컴퓨터의 Windows 서비스에서 작동하지 않습니다. 또한 예외를 throw하지 않습니다 ...

나는 정말로 이것에 붙어 있습니다. :(

이 권한 수 있을까? 다음

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"); 
    } 
} 
+0

당신은 당신이 예외를 삼키는하지 않는 모든 로그인합니까? 'catch' 블록이 있는지 확인하십시오. 'catch' 문에 대한 호스팅 코드를 확인하십시오. 권한이 있으면 예외가 발생합니다. 먼저 로깅을 추가하고 기능 블록을 체크 아웃 한 다음 줄 단위로 추적합니다 가능한 경우 디버거를 연결하십시오. – oleksii

+0

불행히도 디버거를 연결할 수 없습니다. 내가 권한을 가지고 있지 않은 원격 컴퓨터에서 멈추었습니다 ... 정확히 ... 나는 예외를 잡는 방법에 대한 몇 가지 코드를 작성합니다. 귀하의 조언에 감사드립니다. –

답변

0

을이 바보 같은 실수였다. 내 콘솔 응용 프로그램에서

을 내가했다 SSL 인증서를 포트에 바인딩하면 이것은 생산 코드에서 원하지 않는 권한으로 제거되었으므로 분리 된 배치 파일을 가지고 있거나 그렇지 않으면 w hich 수동으로 실행해야합니다 ... 그러나 이것은 내가 잊어 버린 것입니다. :(

관심있는 것들에 대한

은 아래에있는 내 테스트 응용 프로그램의 코드입니다

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; 
}