예전 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()
이라고했지만 지금은 예상대로 서비스가 작동하는 것 같습니다.
제가 언급 한 것 외에 다른 변경을하지 않고 잘 작동했기 때문에 제 편집을보십시오. 왜 그것이 효과가 있었는지 나는 잘 모르겠다. – Mykroft
좋습니다.예, 기본 UI 스레드에서 Winforms 응용 프로그램 내에서 WCF 서비스를 호스팅하는 것은 좋은 생각이 아닙니다. –
NetTCPBinding을 사용하여 거의 동일한 작업을 수행하는 다른 응용 프로그램이 있기 때문에 이상하게 보입니다.이 문제 없이도 작동합니다. – Mykroft