Я добавил описание этого решения в свой блог. Та же самая информация на самом деле, но, возможно, чуть менее фрагментированная
Я нашел альтернативу использованию 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 будет жаловаться на дубликат ключа.
Пространства имен с явными объявлениями :
Если в вашем коде не указано пространство имен explit, кажется , что .NET сгенерирует uri вида http://schemas.datacontract.org/2004/07/MyCompany.Services.MyProduct
. Вы можете отобразить это так же, как и явные пространства имен в моем примере, но я не знаю, есть ли какая-либо гарантия для такого поведения. Поэтому лучше использовать явное пространство имен.
Примечание: сопоставление двух пространств TargetNamespace с одним и тем же пространством ClrNamespace, по-видимому, нарушает генерацию кода