2012-03-15 2 views
0

두 서비스를 연결하려고합니다. Service1은 service2에 이벤트 알림을 보냅니다.WCF 두 서비스 간 콜백

이 두 서비스간에 콜백을 사용하고 싶습니다. service1은 service2에 이벤트를 보내고 service2는 이벤트를 클라이언트에 전달합니다.

두 서비스간에 콜백을 사용할 수 있습니까?

나는 이미 wcf 콜백 샘플을 조사했지만 서비스 통신을 위해 서비스 간에는 아무것도 찾을 수 없다.

도움이 필요합니다. 1 개의 서비스 코드를 아래에서보십시오. 내 질문 : 어떻게 다른 서비스의 코드가 콜백과 같이 보이게 될까요?

아니면이 경우 서비스 중 하나가 클라이언트 역할을합니까? 그리고 어떻게 그렇게 보이게 될까요?

서비스 1 코드 : (인터페이스 클래스)

public interface IMyEvents 
{ 
    [OperationContract(IsOneWay = true)] 
    void Event1(); 
} 

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IMyEvents))] 
public interface SampleInterface 
{ 
    [OperationContract] 
    void DoSomethingAndFireEvent(); 

    [OperationContract] 
    void SubscribeEvent(); 
} 

이 서비스 클래스

public class SampleHandlerSimulator : SampleInterface 
{ 
    static Action m_Event1 = delegate { Console.WriteLine("Catch");}; 

    public void SubscribeEvent() 
    { 
     IMyEvents subscriber = OperationContext.Current.GetCallbackChannel<IMyEvents>(); 
     m_Event1 += subscriber.Event1; 
    } 

    public static void FireEvent() 
    { 
     m_Event1(); 
    } 

    public void DoSomethingAndFireEvent() 
    { 
     CCStateHandlerSimulator.FireEvent(); 
    } 

답변

0

그들 중 하나에 서비스 참조를 추가하여 서비스를 구성이다 (받는 다스 려 기타 서비스). 이렇게하려면 참조 할 서비스가 실행 중인지 확인한 다음 하위 서비스 프로젝트를 마우스 오른쪽 단추로 클릭하고 서비스 참조 추가를 선택하십시오. 이제 부모 서비스에 의해 노출 된 메소드를 호출 할 수 있습니다.

콜백을 위해 양면 바인딩으로 구성된 끝점이 필요합니다. 양면 바인딩에 대한 내용은 here을 참조하십시오. 상위 서비스에 새 엔드 포인트 구성을 추가 할 때 서비스 참조를 업데이트하십시오. 서비스를 호스팅해야합니다.

비슷한 질문이 제기되었습니다 here. wsDualHttpBinding가 유의해야 할 중요한 비트가

<endpoint address="http://localhost:61775/DUPLEXFUN/" binding="wsDualHttpBinding" 
     bindingConfiguration="" name="DUPEND" contract="IDuplexCallback" /> 

참고 : 같은

귀하의 enpoint는 볼 것이다.

귀하의 서비스 계약은 다음과 같이 표시됩니다

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IDuplexCallback))] 
public interface IDuplexService 
{ 

    [OperationContract(IsOneWay = true)] 
    void FormatString(string institution); 
} 

및 서비스 구현이 같은 것입니다 :

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class DuplexService : IDuplexService 
{ 
    IDuplexCallback _callback; 
    string _requestString = String.Empty; 

    public DuplexService() 
    { 
     _callback = OperationContext.Current.GetCallbackChannel<IDuplexCallback>(); 
    } 

    public void FormatString(string text) 
    { 
     //Make the thread to sleep for 10 seconds 
     Thread.Sleep(4000); 
     //Format the input data 
     _requestString = string.Format("Welcome to {0}", text); 
     //Pass the string to the client through the call back function 
     _callback.DuplexCallbackFunction(_requestString); 
    } 
} 

마지막 IDuplexCallback과 같이 선언한다 : 당신의 대답에 대한

public interface IDuplexCallback 
    { 
     [OperationContract(IsOneWay = true)] 
     void DuplexCallbackFunction(string requestString); 
    } 
+0

감사합니다 , 그러나 나는 아직 달릴 수 없다. netuplexpipebinding도 이중으로 사용하고 있습니다. 두 서비스 모두에서 netnamedpipebinding을 구현해야합니까? 두 번째 서비스가 어떻게 구현되어야하는지에 대한 코드 위에 있습니까? 보시다시피 첫 번째 서비스의 코드를 제공했기 때문입니다. 그리고 귀하의 코드는 내 service1 코드에 실제로 들어 맞지 않습니다. – Annonymuze

+0

파이프에 대해서는 잘 모릅니다 만 부모 서비스에서 끝점을 설정하고 자식에 서비스 참조를 추가하면 자식 서비스가 해당 부모 서비스를 구성에 반영합니다. 게시 한 코드는 귀하에게 특정한 것이 아니지만 필요한 태그와 사물을 강조 표시합니다. 어쩌면 부모 서비스 인 app.config를 게시 할 수 있습니까? – ldgorman

+0

PubSub은 당신이 성취하고자하는 것에 따라 더 잘 작동 할 것입니다. 듀플렉스 바인딩과 관련하여 여러 가지 문제를 겪었으며 그만큼 효율적이지는 않습니다. Pub-Sub의 좋은 예와 그렇게하기위한 프레임 워크는 다음에서 볼 수 있습니다. http://www.idesign.net/Downloads – PTiddy