2012-03-29 2 views
2

콜백 함수를 사용하여 WCF 서비스를 설계하고 있지만 콜백 함수 구현을 결코 호출하지 않습니다. 그리고 생성 된 서비스 프록시에 대해 혼란 스럽습니다. 그래서 도와주세요.WCF 콜백 구현 함수가 호출되지 않습니다.

다음은 시나리오입니다. 서버 측에서 서비스 인터페이스 IMyService 및 콜백 인터페이스 IMyServiceCallback을 정의했으며 서버 프로젝트에 IMyService도 구현했습니다. 서버 프로젝트 외에도 다른 클라이언트 프로젝트가있어 VS에 서비스 참조를 추가했습니다. 그리고 클라이언트 측에서 IMyServiceCallback 인터페이스를 구현했습니다. 여기에 문제가 있습니다. 디버깅 할 때 함수가 IMyServiceCallback을 구현하지 않고 절대로 원하는 결과가 나오지 않습니다.

그리고 이것은 내가 혼란스러워하는 부분입니다. 클라이언트 측에서 서비스 참조를 추가하면 IMyService, IMyServiceCallback 및 IMyServiceChannel에 클라이언트 프록시 클래스를 더한 로컬 인터페이스가 실제로 생성됩니다. 그리고 IMyServiceCallback을 로컬로 구현할 때 클래스가 서비스 측이 아닌 로컬 IMyServiceCallback 인터페이스를 구현하도록 선언했습니다. 이것이 문제가 될 수 있습니까? 왜 서로 다른 프로젝트 (그리고 서로 다른 네임 스페이스)에서 인터페이스 선언이 두 가지입니까? 클라이언트 측 인터페이스를 구현하는 이유는 서버 측 인터페이스에서 구현하면 오류가 발생합니다. "서비스를 호출하려고 할 때 ChannelFactory에 제공된 InstanceContext에 CallbackContractType 오류를 구현하지 않는 UserObject가 있습니다."라는 오류가 발생합니다. 그리고 또 다른 혼란스러운 부분은 서버 측에서 IMyCallback 또는 다른 어떤 것으로 IMyCallback으로 콜백 인터페이스 이름을 선언하면 클라이언트 측의 생성 된 인터페이스가 여전히 IMyServiceCallback이됩니다. 이것은 IMyServiceCallback과 마찬가지로 서비스 인터페이스의 이름 인 IMyServiceCallback입니다. 접미사 "콜백". 그리고이 상황에서 나는 또한 "InstanceContext ChannelFactory 제공하는 CallbackContractType 오류를 구현하지 않는 UserObject 포함"있어요.

내가 "서비스 참조 추가"에 대해 잘못 이해하고 구현할 인터페이스를 어떻게 구현해야하는지 생각합니다. 누구든지 나를 도울 수 있을까? 감사!

업데이트 :

어떻게 든 문제가 해결되었습니다. 첫째, 두 가지 선언이 바람직하다. 로컬 클라이언트는 서비스 참조를 추가 할 때 생성되는 로컬 인터페이스를 구현해야합니다. 그리고 내 문제는 또한 내가 정의한 DataContract하지만 생성 된 참조 파일이 없었어요. 서비스 프로젝트의 어셈블리를 참조로 추가했기 때문에 (누군가이 경우 서비스 참조를 추가하면 Datacontract가 생성되지 않습니다) 또는 DataMember 특성이 누락되어 있기 때문일 수 있습니다. 그러나 어쨌든, 두 부분을 모두 수정 한 후에이 기능이 작동합니다.

답변

2

"서비스 참조 추가"및 프록시 생성시 서비스 구현과 완전히 별개입니다. 작성하지 않았고 서비스 소스 코드에 액세스 할 수없는 서비스를 사용하고있을 수 있음을 기억하십시오.

클라이언트 코드는 클라이언트가 생성 한 인터페이스를 사용해야합니다. 서비스를 변경하면 프록시를 다시 생성해야합니다.

이 작업이 너무 복잡하고 양쪽 끝을 항상 제어 할 수 있다면 공통 어셈블리에서 서비스 인터페이스를 공유하고 DuplexChannelFactory.CreateChannel()을 사용하여 런타임에 프록시 클래스를 생성 할 수 있습니다.

귀하의 문제에 관해서는 귀하의 콜백을 제대로 등록하지 않는다고 가정 할 수 있습니다. 이 내용은 here입니다.

+0

답장을 보내 주셔서 감사합니다. 원래 게시물의 업데이트에 대해 언급 했으므로 이제 로컬 인터페이스 선언이 필요하다는 것을 알게되었습니다. 그리고 "필자가 작성하지 않았고 서비스 소스 코드에 액세스 할 수없는 서비스를 사용하고있을 수도 있습니다"라는 말이 맞습니다. 내 문제는 클라이언트 측에서 실수로 생성되지 않은 하나의 DataContract 선언이 있다고 생각합니다. – tete

0

게시하려면 IMyServiceCallback과 IMyService를 같은 프로젝트에 함께 구현해야합니다. 구독 만하는 경우 IMyServiceCallback 인터페이스를 구현해야합니다.

+0

감사합니다. 구독하기 만하면 IMyServiceCallback 만 구현 한 것입니다. – tete

0

내 콜백 명령어가 함수 호출에 포함 된 경우 문제가 해결되었습니다. 결과를 반환하지 않는 메서드에서 콜백을 배치하는 것이 좋습니다. 그러나 콜백 명령을 함수 내에두면 타임 아웃 문제가 발생했습니다.

I 함수 내에서 BackgroundWorker 구성 스레드를 사용하여 해결이 호출되는 : 답장을 보내

public static IMyServiceCallback Callback; 
. 
. 
. 

     TaskStateData taskStateData = GetSomeData(); 

     BackgroundWorker backgroundWorker = new BackgroundWorker(); 

     backgroundWorker.DoWork += (se, ev) => 
      { 
       Tuple<OperationContext, TaskStateData> data = ev.Argument as Tuple<OperationContext, TaskStateData>; 
       var operationContext = data.Item1; 

       if (operationContext != null) 
       { 
        Callback = operationContext.GetCallbackChannel<IMyServiceCallback>(); 
        Callback.OnCallBack(); 
       } 
      }; 

     Tuple<OperationContext, TaskStateData> payload = new Tuple<OperationContext, TaskStateData>(OperationContext.Current, taskStateData); 
     backgroundWorker.RunWorkerAsync(payload); 
관련 문제