2012-06-20 1 views
1

나는 서버 인 # WCF 웹 서비스를 가지고 있으며 클라이언트 2 명이 자바 클라이언트이고 다른 클라이언트가 C++ 클라이언트입니다. . 나는 두 클라이언트가 동시에 실행되기를 바랍니다. 내가 가지고 있고 시나리오를 파악할 수없는 시나리오는 다음과 같습니다.한 번에 두 개 이상의 클라이언트가있는 WCF webservice를 호출하는 방법 (병렬로)

내 Java 클라이언트가 WCF 웹 서비스에 전화를 걸고 처리 시간이 10 분 정도 걸리는 반면 C++ 클라이언트가 전화를 걸려면 웹 서비스와 응답을 다시 얻으십시오. 하지만 지금은 자바 클라이언트 요청이 처리 될 때 C++ 클라이언트를 사용하여 웹 서비스를 호출 할 수 있습니다. Java 클라이언트 요청이 완료 될 때까지 C++ 클라이언트 요청에 대한 응답을 다시받지 못합니다.

이 작업을 병렬로 수행하는 방법을 알려주십시오. 미리 감사드립니다.

+1

나는 당신이 동시성을 찾고 있다고 가정한다. WCF 서비스 인스턴스 및 서비스 제한이 WCF 동시성의 주된 기여이기 때문에 WCF 서비스 인스턴스 및 서비스 제한에 대해 자세히 읽어 볼 것을 권장합니다. –

답변

2

: 여기 예를 들어 이에 대한 자세한.

그것은 모든 InstanceContextMode에 대한 설정에 따라 달라집니다

  • PerSession 이와에게 수단을, 각 세션 (즉 같은 클라이언트에서) 요청의 수

  • 를 처리하는 서비스 클래스의 카피를 가져옵니다

    PerCall은 각 요청이 요청을 처리하기 위해 서비스 클래스의 최신 사본을 얻는다는 것을 의미합니다 (통화를 처리 한 후에 다시 처리됩니다)

  • 단일은 싱글 톤을 가짐을 의미합니다. 서비스 클래스 복사본은 하나뿐입니다.

싱글 톤이있는 경우 - 스스로에게 질문해야합니다. 왜? 기본적으로 PerCall이 권장 설정이므로 한 번에 여러 요청을 쉽게 지원해야합니다.

자세한 설명은 Understanding Instance Context Mode을 참조하십시오.

+0

어떤 아이디어가 될 것입니까? InstanceContextMode의 기본값이됩니까? 받아 들일 수있는 기본 클라이언트 요청은 무엇입니까? – krishna555

+0

@ krishna555 : 사용 된 바인딩에 따라 달라집니다. PerSession 또는 PerCall –

1

서비스 클래스를 통해 사용

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 

속성을. 모든 "정상적인"WCF 서비스가 가장 확실히 주어진 시간에 하나 개 이상의 클라이언트 요청을 처리 할 수 ​​

http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and

+0

인스턴스 컨텍스트 모드가'PerCall' 또는'PerSession'이고 잠재적으로 서비스 클래스의 프로그래밍을 훨씬 어렵게 만드는 경우 (모든 것이 스레드로부터 안전해야합니다) ** ** 필요하지 않습니다 ** –

1

이 질문에 대한 주변이지만 반환하는 데 10 분 이상 걸리는 메서드에서 비동기 콜백을 고려한 다음 프로세스를 별도의 스레드에서 실행하고 있습니까? 어쨌든 서비스가 여러 발신자를 허용해야하지만 (서비스 요청은 수천 개의 동시 요청을 처리해야 함) 10 분 동 기적으로 서비스 요청을 대기하는 것은 좋지 않으며 문제를 해결할 수도 있습니다.

WCF를 호출 할 때 동 기적으로 또는 비동기 적으로 호출 할 수 있습니다. 동기 호출은 응답이 동일한 작업에서 호출자에게 다시 전송되기를 기다립니다. 호출자에서는 "myresult = svc.DoSomething()"과 같이 보입니다. 비동기 호출을 사용하면 호출자는 서비스가 완료 될 때 호출 할 수 있지만 응답을 기다리지는 않습니다. 호출자는 응답을 기다리는 동안 차단하지 않으며 비즈니스에 대해 간다.

DoSomethingCompletedEventArgs 걸릴 것입니다 귀하의 콜백 : 무효 myCallback (개체를 보낸 사람, DoSomethingCompletedEventArgs 전자)를 { VAR myResult = e.Result; // 그 전에 사용했던 결과를 사용하십시오. }

이벤트 핸들러처럼 콜백 함수를 등록하십시오. svc.DoSomethingCompleted + = myCallback; 다음 svc.DoSomethingAsync(). 해당 문에는 반환 값이 없습니다. 이 서비스는 myCallBack을 완료하고 결과를 전달할 때 myCallBack을 실행합니다. Silverlight의 모든 WCF 호출은 비동기 적이어야하지만 다른 클라이언트의 경우이 제한이 없습니다.

다음은 약간 다른 방법을 자세히 설명하는 코드 프로젝트입니다. http://www.codeproject.com/Articles/91528/How-to-Call-WCF-Services-Synchronously-and-Asynchr

이것은 클라이언트가 10 분 이상의 프로세스 동안 블로킹하지 않도록하지만 실제로 서비스 자체의 작동 방식을 변경하지는 않습니다.

이제 제가 언급 한 두 번째 부분은 서비스 내부와 별도의 스레드에서 10 분 이상의 프로세스를 실행하는 것입니다. 서비스 메소드 자체는 매우 얇고 다른 라이브러리에서 기능을 호출해야합니다. 오랜 시간이 걸리는 함수는 자신의 스레드에서 이상적으로 호출되어야합니다 (완료시 콜백을 서비스 측에 등록하는 배경 작업자를 말합니다). 그리고 일종의 지속적인 시스템을 통해 진행 상황을 추적하고 클라이언트에게 돌아갈 필요가있는 결과. 그것이 나 였다면 나는 db에 프로세스에 대한 요청을 등록한 다음 db를 완료하여 업데이트 할 것입니다. 클라이언트는 주기적으로 간단한 폴링을 시작하여 프로세스가 완료되었는지 확인하고 결과를 얻습니다. 프로세스가 자동으로 완료 될 때 알림을 받도록 양면 바인딩을 설정할 수도 있지만 양면 바인딩을 수행 한 지 몇 년이 지났음을 알았 기 때문에 정확하게 작동하는 것을 기억하지 못합니다.

이 주제는 너무 커서 여기 깊이 들어가기에는 너무 큽니다. BackgroundWorker로 멀티 스레드 작업을 연구 할 것을 제안합니다.

+0

비동기 콜백과 관련된 질문을 완전히 이해하지 못했습니다 (조금 더 설명 할 수 있습니까?). 기본 서비스에서 한 번에 여러 발신자를 허용해야한다고 말했듯이 허용 할 수있는 전화 번호 (고정 번호)와 같은 아이디어가 있습니까? – krishna555

+1

위의 '답'을 편집 할 수 있도록 여기에 댓글을 달 수있는 여유가 없습니다. – anyeone

+0

당신이 위에서 제공 한 설명은 도움이 가득 차서 동일한 웹 서비스를 호출하고 주 프로세스가 실행중인 단계를 사용자에게 알리는 또 다른 C++ 클라이언트를 작성하여 사용자가 프로그램이 여전히 실행 중이며 특정 위치. 제안 해 주셔서 감사합니다. – krishna555

관련 문제