Проблема с WSDL, сгенерированным из общего сервисного контракта в VS 2008 - PullRequest
1 голос
/ 22 мая 2009

[Редактировать] Я нашел способ заставить его работать, комментарии в коде.

У меня есть десятки, и скоро у меня будут сотни рабочих процессов со следующим контрактом:

[ServiceContract(Namespace = "http://schema.company.com/messages/")]
public interface IBasicContract<TRequest, TResponse>
  where TRequest : class
  where TResponse : class
{
  [OperationContract]
  [XmlSerializerFormat]
  [ServiceKnownType(typeof(Aggregate))]
  TResponse GetReport(TRequest inquiry);

  [OperationContract]
  [XmlSerializerFormat]
  [ServiceKnownType(typeof(Aggregate))]
  string GetRawReport(string guid);

  [OperationContract]
  [XmlSerializerFormat]
  [ServiceKnownType(typeof(Aggregate))]
  TResponse GetArchiveReport(string guid);
}

Я создал общую реализацию:

// v added
[ServiceBehavior(Namespace = "http://schema.company.com/messages/")]
// ^ added
public abstract class BasicWorkflowSvc<TRequest, TResponse, TWorkflow> : IBasicContract<TRequest, TResponse>
  where TRequest : class
  where TResponse : class
  where TWorkflow : class
{
  //...
}

Реальная реализация выглядит так:

[XmlSerializerFormat]
// v changed
[ServiceContract(Namespace = "http://services.company.com/messages/")]
// ^ changed
public interface IActualProductSvc : IBasicContract<ActualProductRq_Type, ActualProductRs_Type>
{
}

[ServiceBehavior(Namespace = "http://services.company.com/ActualProduct/v1.0")]
// v added
[MessageContract(WrapperNamespace = "http://services.company.com/ActualProduct/v1.0")]
// ^ added
public class ActualProductSvc : BasicWorkflowSvc<ActualProductRq_Type, ActualProductRs_Type, EF>, IActualProductSvc
{
  //...
}

Моя проблема заключается в следующем: когда я добавляю ссылку на службу для этого проекта в другой проект, сгенерированный код имеет дополнительные (и бесполезные) типы запросов и ответов:

[GeneratedCode("System.ServiceModel", "3.0.0.0")]
[ServiceContract(Namespace = "http://services.company.com/ActualProduct/v1.0", ConfigurationName = "ActualProduct.IActualProductSvc")]
public interface IActualProductSvc
{
  // CODEGEN: Generating message contract since the wrapper namespace (http://schema.company.com/messages/) of message GetReportRequest does not match the default value (http://services.company.com/ActualProduct/v1.0)
  [OperationContract(Action = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetReport",
    ReplyAction = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetReportResponse")]
  [XmlSerializerFormat()]
  [ServiceKnownType(typeof (Aggregate))]
  GetReportResponse GetReport(GetReportRequest request);

  // CODEGEN: Generating message contract since the wrapper namespace (http://schema.company.com/messages/) of message GetRawReportRequest does not match the default value (http://services.company.com/ActualProduct/v1.0)
  [OperationContract(
    Action = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetRawReport",
    ReplyAction = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetRawReportResponse")]
  [XmlSerializerFormat()]
  [ServiceKnownType(typeof (Aggregate))]
  GetRawReportResponse GetRawReport(GetRawReportRequest request);

  // CODEGEN: Generating message contract since the wrapper namespace (http://schema.company.com/messages/) of message GetArchiveReportRequest does not match the default value (http://services.company.com/ActualProduct/v1.0)
  [OperationContract(
    Action = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetArchiveReport",
    ReplyAction =
      "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetArchiveReportResponse")]
  [XmlSerializerFormat()]
  [ServiceKnownType(typeof (Aggregate))]
  GetArchiveReportResponse GetArchiveReport(GetArchiveReportRequest request);
}

... с кучей обёрток:

[DebuggerStepThrough()]
[GeneratedCode("System.ServiceModel", "3.0.0.0")]
[MessageContract(WrapperName = "GetReport", WrapperNamespace = "http://schema.company.com/messages/", IsWrapped = true)]
public partial class GetReportRequest
{
  [MessageBodyMember(Namespace = "http://schema.company.com/messages/", Order = 0)]
  public ActualProductRq_Type inquiry;

  public GetReportRequest()
  {
  }

  public GetReportRequest(ActualProductRq_Type inquiry)
  {
    this.inquiry = inquiry;
  }
}

Есть ли способ, кроме удаления их вручную, сделать эти обертки НЕ генерируемыми? Причина, по которой я спрашиваю, состоит в том, что они не были сгенерированы до того, как я попытался извлечь общий контракт из всех рабочих процессов - не было общего интерфейса с другим пространством имен - и люди, которые используют эти рабочие процессы, жалуются на необходимость обновления ссылки, а затем вручную удалите много вещей из файлов Reference.cs.

Я ненавижу импортер WSDL в Visual Studio: (

Ответы [ 2 ]

0 голосов
/ 22 мая 2009

Есть ли у вас такая же проблема, если вы используете svcutil.exe для генерации прокси-классов? Если это так, то это не проблема VS2008.

Эта проблема меня не удивляет. Обобщения в .NET не являются макросами. Вы ожидаете, что генератор WSDL обнаружит конкретный тип, используемый в качестве фактического параметра типа, для создания экземпляра общего контракта на обслуживание. Я думаю, что просить об этом нетривиально.

Я рекомендую вам создать простую версию этой проблемы и сообщить о ней по номеру http://connect.microsoft.com/visualstudio/. Сначала выполните быстрый поиск, чтобы увидеть, было ли уже сообщено. Когда вы сообщите об этом, опубликуйте URL-адрес отчета в качестве редактирования вашего вопроса, чтобы другие могли проголосовать за него.

0 голосов
/ 22 мая 2009

Когда вы добавляете или настраиваете ссылку на службу на стороне клиента, появляется флажок, который упоминает что-то о генерации асинхронных методов.

Если это отмечено, попробуйте снять его и посмотреть, удаляет ли это автоматически сгенерированные методы запроса / ответа.

У меня была похожая проблема больше года назад, поэтому решение немного туманное.

...