2009-06-17 4 views
4

예전 ASP.NET 웹 서비스를 대체하기 위해 사용하고있는 WCF 서비스가 있습니다. 서비스가 정상적으로 작동하는 것으로 보이지만 어떤 이유로 든 동시 요청을 처리 할 수 ​​없습니다.Winforms에서 호스팅하는 WCF 서비스가 왜 단일 스레드입니까?

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class HHService : IHHService 

내 호스트 선언은 다음과 같습니다 : 서비스의 내 구현에는 다음과 같은 속성이 있습니다

baseAddress = new Uri("http://0.0.0.0:8888/HandHeld/"); 
host = new ServiceHost(typeof(HHService), baseAddress); 

ServiceMetadataBehavior behavior; 
behavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
if (behavior == null) 
{ 
    behavior = new ServiceMetadataBehavior(); 
    behavior.HttpGetEnabled = true; 
    behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
    host.Description.Behaviors.Add(behavior); 
} 
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); 
host.AddServiceEndpoint(typeof(IHHService), new BasicHttpBinding(), "HHService.asmx"); 
HHService.LogMessage += new EventHandler<HHService.LogMessageEventArgs>(HHService_LogMessage); 
host.Open(); 

서비스가 실행되고 반환 올바른 결과를하지만,이 클라이언트는에 전화를하려고하면 함께 실행되는 호출이 아니라 다른 클라이언트가 완료 될 때까지 한 클라이언트가 차단하는 동일한 시간. 구성 파일을 사용하고 있지 않습니다. 나는 모든 것을 프로그래밍 방식으로 시도하고있다. 이 문제를 일으키는 설정이 잘못 되었습니까? 이 문제없이 NetTCPBinding을 사용하여 다른 서비스를 실행했습니다.

편집 : 존 손더스에 대응 : 내가 어떤 ASP.NET 호환 모드에 익숙하지 않다. 나는 어떤 세션 상태도 사용하지 않고있다. 실제 메소드의 구현을 제외하고 다른 모든 것들은 여기에 나열된 코드에 있습니다.

가능한 해결 방법 :

내가 기본 폼의 Form_Load 이벤트에서 host.Open() 함수를 호출했다. 나는 별도의 스레드로 호출을 옮겼다. 이 스레드는 모두 host.Open()이라고했지만 지금은 예상대로 서비스가 작동하는 것 같습니다.

답변

4

인스턴스 컨텍스트 모드가 PerCall 인 경우 정의에 따라 모든 호출이 새 서버 인스턴스를 얻으므로 서버는 항상 단일 스레드입니다.

IIS는 n 개의 동시 호출자를 처리 할 수있는 여러 서버 인스턴스를 스핀 업할 수있는 IIS 환경에서 작동합니다. 각 호출자는 각 들어오는 요청에 대해 단일 스레드 서버로 각각 하나씩 처리 할 수 ​​있습니다.

WinForms 앱이 여러 발신자를 쉽게 처리 할 수 ​​없기 때문에 몇 가지 사항을 다시 생각해 볼 수 없기 때문에 양식 앱 내에서 WCF를 호스팅하는 의견에 언급했습니다. 재검토해야하는 디자인 결정 일 수 있습니다. 서비스 코드의 인스턴스

마크

+0

제가 언급 한 것 외에 다른 변경을하지 않고 잘 작동했기 때문에 제 편집을보십시오. 왜 그것이 효과가 있었는지 나는 잘 모르겠다. – Mykroft

+0

좋습니다.예, 기본 UI 스레드에서 Winforms 응용 프로그램 내에서 WCF 서비스를 호스팅하는 것은 좋은 생각이 아닙니다. –

+0

NetTCPBinding을 사용하여 거의 동일한 작업을 수행하는 다른 응용 프로그램이 있기 때문에 이상하게 보입니다.이 문제 없이도 작동합니다. – Mykroft

0

서비스 기능 어딘가에 잠금 장치가 있습니까?

+0

없음 더 잠금이 없습니다. – Mykroft

0

당신은 ASP.NET 호환 모드를 사용하고 있습니까? 세션 상태?


내 질문은 다음과 같습니다. 무엇이 단일 스레드라고 생각합니까? 어떻게 결정 했습니까? 문제를 해결하지 않았다는 것을 증명하기 위해 어떤 테스트를 사용합니까? 가양 성일 수 있습니다.

관련 문제