Сервисное ссылочное пространство имен WCF отличается от оригинала

Я думаю, что Вы ищете, SM_CYCAPTION - это - высота строки заголовка. SM_CYBORDER высота горизонтальных краев окна.

13
задан Community 23 May 2017 в 12:16
поделиться

2 ответа

Я добавил описание этого решения в свой блог. На самом деле информация та же, но, возможно, немного менее фрагментированная

. Я нашел альтернативу использованию 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, поэтому я выбрал эту схему. Возможно, вам придется выполнить сборку вручную, чтобы все заработало позже, так что сделайте это.

Как только это будет сделано, включите параметр Показать все файлы в обозревателе решений. Разверните ссылку на службу, которую вы добавили ранее. Дважды щелкните ссылку . svcmap .

Там будет элемент , который вам нужно будет отредактировать. Продолжая мой пример:

<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: сопоставление двух TargetNamespaces с одним и тем же ClrNamespace, похоже, нарушает генерацию кода

21
ответ дан 1 December 2019 в 22:24
поделиться

Ваш вариант использования был неправильным.

Вы никогда не должны были включать службу в качестве ссылки в первую очередь.

Я считаю, что svcutil.exe примет переключатель, указывающий полное пространство имен использовать.

1
ответ дан 1 December 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: