[Редактировать] Я нашел способ заставить его работать, комментарии в коде.
У меня есть десятки, и скоро у меня будут сотни рабочих процессов со следующим контрактом:
[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: (