2009-05-14 4 views
0

결국 클라이언트가 호스팅하는 독립 실행 형 서비스 (계약 B)를 호출하는 WCF 서비스 (계약 A)를 구현 중입니다. 클라이언트가 프록시를 구축하기 위해 내 서비스의 WSDL을 쿼리하는 디자인 타임에 클라이언트가 그 서비스를 구축 할 수 있도록 계약 B 용 WSDL을 포함하고 싶습니다. 불행히도, 나는 서비스에 의해 방출 된 WSDL에 계약 B를 삽입하는 방법을 알 수 없다. 계약이 인터페이스이기 때문에 [DataContract] 특성이 없으므로이를 알려진 유형으로 추가 할 수 없습니다. 방출 된 WSDL에 계약을 삽입하는 다른 방법이 있습니까? 처음에는WCF의 MEX 공급자가 만든 WSDL에 관련없는 계약을 삽입

[ServiceContract] 
public interface IServerService 
{ 
    [OperationContract] 
    void GiveTheServerMyServiceUri(string uri); 

    [OperationContract] 
    void TellAllClientsSomething(string message); 
} 

// THIS IS THE INTERFACE I WANT TO INCLUDE IN THE WSDL 
[ServiceContract] 
public interface IClientService 
{ 
    [OperationContract] 
    void ReceiveMessageFromServer(string message); 
} 

public class ServerService : IServerService 
{ 
    private List<string> knownClients; 

    public void GiveTheServerMyServiceUri(string uri) 
    { 
    knownClients.Add(uri); 
    } 

    public void TellAllClientsSomething(string message) 
    { 
    foreach (string clientUri in knownClients) 
    { 
     // 1. Create instance of ClientServiceProxy using client's uri 
     // 2. Call proxy.ReceiveMessageFromServer(message) 
    } 
    } 
} 

는이 이중 계약의 교과서 예제 것 같다 :

다음은 예입니다. 그러나이 특정 응용 프로그램의 경우 여러 가지 이유로 클라이언트와 서버를 좀 더 분리해야하므로 클라이언트에게 WSDL을 통해 구현할 인터페이스를 제공하고 자체 서비스를 호스트하게하고 그냥 서비스의 URL을 말해.

답변

1

나는 이것이 합리적이라고 생각하지 않습니다. 귀하의 서비스가 다른 서비스의 서비스 계약을 이행하지 않는 한, 그렇게하지 마십시오.

한편 서비스 이 다른 서비스 계약을 구현하고 다른 서비스의 클라이언트가됩니다. 그런 다음 다른 서비스 계약에 대한 호출을 해당 다른 서비스에 위임 할 수 있습니다.


나는 이것을 확실히 시험해 보았습니다. 새로운 WCF Service 라이브러리 프로젝트를 만들었습니다. 이로써 두 가지 작업으로 IService1을 구현하는 Service1이 생성되었습니다. [ServiceContract] 특성을 수정하여 특정 네임 스페이스 (http://localhost/service1)를 사용했습니다.

나는 새로운 서비스를 추가하여 Service2에 IService2를 구현하고 단일 작업 (DoWork)을 제공했다. http://localhost/service2/을 사용하기 위해 [ServiceContract]를 업데이트했습니다.

그런 다음 Service1을 업데이트하여 IService2와 IService1을 구현하고 IService2.DoWork를 Service2 서비스에 위임했습니다. IService2를 구현하는 새로운 종단점을 추가해야했기 때문에 두 개가 충돌하지 않도록 상대 주소를 지정해야했습니다 (동일한 프로젝트에 있었기 때문에). 결과는 다음과 같습니다.

using System; 

namespace WcfServiceLibrary1 
{ 
    public class Service1 : IService1, IService2 
    { 
     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      if (composite.BoolValue) 
      { 
       composite.StringValue += "Suffix"; 
      } 
      return composite; 
     } 

     public void DoWork() 
     { 
      Service2Reference.IService2 svc = null; 
      try 
      { 
       svc = new Service2Reference.Service2Client(); 
       svc.DoWork(); 
      } 
      finally 
      { 
       if (svc != null) 
       { 
        ((IDisposable)svc).Dispose(); 
       } 
      } 
     } 
    } 
}