Внедрение несвязанного контракта в WSDL, созданный поставщиком MEX WCF. - PullRequest
0 голосов
/ 15 мая 2009

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

1 голос
/ 15 мая 2009

Я не вижу в этом смысла. Если ваш сервис не реализует договор на обслуживание другого сервиса, не делайте этого.

С другой стороны, ваша служба может реализовать другой контракт на обслуживание и стать клиентом другой службы. Затем он может делегировать вызовы другому контракту на обслуживание другому сервису.


Я просто попробовал это, чтобы убедиться. Я создал новый проект библиотеки 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();
                }
            }
        }
    }
}
...