2009-05-14 3 views
0

Я реализую службу WCF (контракт A), которая в конечном итоге совершит вызовы к автономной службе (Контракт B), размещенной клиентом. Во время разработки, когда клиент запрашивает WSDL моей службы для создания своего прокси-сервера, я хотел бы включить WSDL для контракта B, чтобы клиент мог создать свою службу вокруг этого. К сожалению, я не могу понять, как вводить контракт B в WSDL, испускаемый службой. Поскольку контракт является интерфейсом и не имеет атрибута [DataContract], я не могу добавить его как известный тип. Есть ли другой способ вставить контракт в выпущенный WSDL?Внедрение несвязанного контракта в WSDL, созданный провайдером MEX WCF

Вот пример:

[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. Это создало Service1, реализующее IService1, с двумя операциями. Я изменил атрибут [ServiceContract] для использования определенного пространства имен (http://localhost/service1).

Затем я добавил новый сервис, который дал мне Service2, реализующий IService2, с одной операцией (DoWork). Я обновил [ServiceContract], чтобы использовать http://localhost/service2/.

Затем я обновил 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(); 
       } 
      } 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^