Ответ 1
Я добавил в свой блог запись этого решения. Такая же информация действительно, но, возможно, немного менее фрагментированная
Я нашел альтернативу использованию svcutil.exe
для выполнения того, что я хочу. Он (imo) упрощает обновление служебной ссылки, чем перезапуск утилиты.
Вы должны явно указать uri пространства имен в своих ServiceContract и DataContracts (см. ниже для комментариев).
[ServiceContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public interface IService
{
[OperationContract]
CompositeType GetData();
}
[DataContract(Namespace = "http://company.com/MyCompany.Services.MyProduct")]
public class CompositeType
{
// Whatever
}
Пространство имен может быть любым, но технически оно должно быть действительным uri, поэтому я выбрал эту схему. Возможно, вам придется вручную создавать вещи для работы, поэтому сделайте это.
Как только это будет сделано, включите параметр Показать все файлы в обозревателе решений. Разверните ссылку на службу, добавленную ранее. Дважды щелкните файл Reference.svcmap
.
Будет элемент <NamespaceMappings />
, который вам нужно будет отредактировать. Продолжая мой пример:
<NamespaceMappings>
<NamespaceMapping
TargetNamespace="http://company.com/MyCompany.Services.MyProduct"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>
Сохраните файл, щелкните правой кнопкой мыши ссылку на службу и выберите Обновить ссылку службы.
Вы можете добавить столько отображений, сколько вам нужно (мне действительно нужны были два). Эффект такой же, как подход svcutil /namespace:
, но без использования самой командной строки, что упрощает его обновление.
Разница с svcutil
Недостатком этого подхода является то, что вам нужно использовать явные сопоставления пространства имен. Используя svcutil
, у вас есть возможность сопоставить все, явно не отображаемые таким образом (решение, на которое ссылался Джон Сондерс):
svcutil /namespace:*,MyCompany.Services.MyProduct ...
Возможно, вы подумали использовать:
<NamespaceMappings>
<NamespaceMapping
TargetNamespace="*"
ClrNamespace="MyCompany.Services.MyProduct" />
</NamespaceMappings>
но это будет не, потому что Visual Studio уже неявно добавляет это сопоставление, указывая на сгенерированное имя пространства имен, от которого мы пытаемся избавиться. Вышеупомянутая конфигурация заставит Visual Studio жаловаться на дублирующий ключ.
Явное пространство имен объявлений:
Если в вашем коде не указано пространство имен эксплимента, кажется, что .NET будет генерировать uri формы http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct
. Вы можете сопоставить это как и явные пространства имен в моем примере, но я не знаю, есть ли какие-либо гарантии для этого поведения. Следовательно, переход с явным пространством имен может быть лучше.
NB: отображение двух пространств имен TargetNames в одно и то же пространство ClrNamespace приводит к нарушению генерации кода