2010-12-30 7 views
3

Windows Server 2003 (Amazon Virtual Machine)에 Windows 서비스가 있습니다. 일부 응용 프로그램은 파이프를 사용하여 통신 할 수 있지만 파이프를 사용하는 래퍼가 있습니다. 그것은 테스트를 거쳐 작동합니다. 또한 언급 된 Windows 서비스와 통신하는 C# (ASP.NET)으로 작성된 웹 서비스가 있습니다. Web Method가 호출되면 클래스의 인스턴스를 만들고 함수를 호출합니다.이 함수는 Windows Service에 "연결"하고 해당 함수에 작업을 게시합니다. 그러나 웹 메서드 내부가 스레드로 만들어지고 Windows 서비스에 "연결"되는 함수가 스레드 내부에서 호출되면 연결이 실패합니다. Windows 서비스에 연결하면 파이프가 사용됩니다. 웹 서비스는 IIS7에서 작동합니다. 디버거 (VS 2010에서 시작된 로컬 서버) 또는 IE7에서 로컬 IIS7에서 작동하는 웹 서비스의 웹 메서드를 호출 할 때 내 로컬 컴퓨터의 모든 동작을 언급 할 가치가 있습니다. 로컬에서는 모든 작업이 가능하지만 Amazon 인스턴스에서는 그렇지 않습니다. 저는 웹 프로그래머가 아니므로 보안에 문제가 있다고 생각합니다. 어떤 힌트? 감사.ASMX 웹 서비스 문제 Windows 서비스와 별도의 스레드로 통신

편집 : Uwe의 의견은 웹 메소드가 http를 사용하여 일부 파일을 다운로드하려고 시도하고 C : \ intetpub \ wwwroot \ files \ 경로에 저장한다는 것을 상기 시켰습니다. 웹 메소드에서 파일을 다운로드하면 작동합니다 , 웹 메서드에서 생성 된 다른 스레드에서 수행되면 다운로드가 실패합니다 예외 : 액세스가 거부되었습니다. 따라서 언급 된 폴더의 보안 설정을 변경하고 IIS7 (IIS_IUSRS)에 의해 작성된 명시 적으로 허용 된 사용자가 해당 폴더를 읽고 쓸 수 있습니다. . 지금 파일을 다운로드 할 수 있습니다 이러한 문제의 원인은 같은 것 같다

편집 :..이 솔루션은 윌의 제안에 대한 답변으로 이동

+0

세부 정보를 게시 할 수 있습니까? "연결 실패"가 실제로 어떻게 작용합니까? 나는. detailled 오류 메시지, 스택 추적, 동작 등 –

+1

"연결"이 함수 호출이기 때문에 연결에 실패하는 방법과 관련이 없습니다. 문제는 다음과 같습니다. 웹 서비스를 실행하는 동일한 스레드의 통신 인 경우 웹 서비스에서 Windows 서비스와 통신 할 수 있습니다. 웹 메서드가 새 스레드를 만드는 경우 - 통신이 실패합니다. 내가 언급 한 Windows 서비스에서 자세한 내용을 받았습니다. Amazon Virtual Machine의 동일한 스레드에서 작동하며 스레드가 다르거 나 다른 스레드를 사용하는 경우에도 내 로컬 컴퓨터에서 작동하지 않기 때문에 보안 또는 사용 권한과 관련된 것입니다. 감사. – Vladimir

+1

@Vladimir : 연결이 실패하는 방법과 관련이 없다면 전혀 실패하지 않는 척하지 않겠습니까? 물론 관련성이 있습니다. –

답변

2

좋아들, 솔루션으로 발견되고 내 자신의 질문에 대한 대답으로 여기에 게시 할 것을 권유합니다. 따라서 솔루션 :

웹 메서드로 만든 스레드를 가장해야하기 때문에 문제가 발생했습니다. 전부

[WebMethod] 
public void Fnc() 
{ 
    ... 
    ... 
    System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent(); 
    System.Threading.Thread postJobThread = new Thread(PostJobThread); 
    postJobThread.Start(wi); 
    ... 
} 

... 

private void PostJobThread(object ob) 
{ 
    System.Security.Principal.WindowsIdentity wi = (System.Security.Principal.WindowsIdentity)ob; 
    System.Security.Principal.WindowsImpersonationContext ctx = wi.Impersonate(); 

    ... 
    // Do some job which couldn't be done in this thread 
    ... 
    // OK, job is finished 
    if(ctx != null) 
    ctx.Undo(); 
} 

: 그래서, 호출 방법에 내가 좋아하는 뭔가했다. 내 질문에 댓글을 달아 준 사람 덕분에 다른 사람에게 유용 할 수 있기를 바랍니다.

관련 문제