У нас есть служба WCF, которая недавно переместила все операции на асинхронные. Мы внедрили это с новым контрактом на обслуживание, чтобы охватить эти операции, но как ServiceContract
Name, так и OperationContract
Names нового контракта указывают на старые ServiceContract
и OperationContract
Names для обеспечения обратной совместимости.
Примерно так:
[ServiceContract(Namespace= "", Name = nameof(IOldContract))]
public interface INewAsyncContract
{
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract(Name = nameof(IOldContract.DoThing))]
Task<DoThingResponse> DoThingAsync(DoThingRequest doThingRequest);
}
В то время как старый контракт выглядит следующим образом:
[ServiceContract]
public interface IOldContract
{
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
DoThingResponse DoThing(DoThingRequest doThingRequest);
}
Примечание. В старом контракте на обслуживание отсутствует значение пространства имен. Это верно в кодовой базе.
Теперь к вопросу: когда мы внедряем эту службу с пространством имен ServiceContract
в новом контракте на обслуживание, мы получаем эту ошибку при переходе к службе:
ExceptionDetail, вероятно, созданный IncludeExceptionDetailInFaults = true, значение которого: System.InvalidOperationException: было сгенерировано исключение при вызове расширения экспорта WSDL: System.ServiceModel.Description.DataContractSerializerOperationBehavior contract: IOldContract ---->System.Xml.Schema.XmlSchemaException: глобальный элемент 'DoThingResponse' уже объявлен.
И наоборот, если мы публикуем без пространства имен, служба работает как положено, но предоставляется пространство имен по умолчанию. (http://tempuri.org),, который нам не нужен.
Почему пространство имен ServiceContract
мешает отклонению DoThingResponse?
Изменить, чтобы добавить определение DoThingResponse:
[DataContract(Namespace = "")]
public class DoThingResponse
{
[DataMember]
public obj ResponseObj { get; set; }
}