Как предотвратить создание «указанных» свойств в клиентах WCF? - PullRequest
10 голосов
/ 12 января 2010

У меня две службы .NET 3.5 WCF с VS2008.

У меня есть два клиента WCF в Silverlight для использования этих сервисов. Клиенты создаются с помощью «Добавить ссылку на сервис». Я использую Silverlight 4.

ОДИН из прокси генерируется с Specified свойствами для каждого свойства. Это класс 'message-in' для моего метода обслуживания:

    // properties are generated for each of these fields
    private long customerProfileIdField;        
    private bool customerProfileIdFieldSpecified;        
    private bool testEnvField;        
    private bool testEnvFieldSpecified;

Теперь мой другой сервис (все еще с клиентом Silverlight) НЕ генерирует Specified свойств.

Теперь мне нет дела до «принципов хорошей SOA». Я просто хочу избавиться от этих чертовых свойств, потому что в контексте того, что я делаю, я их абсолютно ненавижу.

Должна быть какая-то разница между этими двумя службами, но я не хочу полностью разбирать их, чтобы выяснить разницу.

A аналогичный вопрос до того, как получил ответ ' Вы не можете сделать это ' - что определенно не соответствует действительности, потому что он у меня есть - я просто не знаю, что я сделал по-другому.

Редактировать: Сейчас я нахожусь в ситуации, когда я воссоздаю свой прокси-сервер Silverlight 4 для своей службы 3.5 WCF (все на одном компьютере с локальным хостом), что иногда я получаю свойства «Указано», а иногда нет. Я больше не думаю (как я изначально подозревал), что это связано исключительно с некоторой конфигурацией конечной точки или уровнем обслуживания [атрибут]. В самом сообщении есть определенные триггеры, которые вызывают генерирование Specified (или нет). Там может быть много факторов или что-то очень простое.

Ответы [ 4 ]

11 голосов
/ 12 января 2010

попробуйте это в вашей службе WCF, где объявлено свойство

[DataMember(IsRequired=true)]
public bool testEnvField { get; set; }

IsRequired=true отменяет необходимость в свойстве testEnvFieldSpecified

2 голосов
/ 22 января 2010

Эти дополнительные Заданные свойства создаются для типов значений, которые указываются как необязательные в контракте или в разметке атрибута.

Так как типы значений имеют значение по умолчанию, для этих свойств добавляются дополнительные флаги Specified, чтобы позволить клиенту (и серверу) различать что-то явно не указанное или явно указанное - которое вполне может быть установлено значение по умолчанию. Без него целые числа всегда заканчивались бы 0 (и сериализовались), даже если вы не установили их (из-за сопоставления в int) в своем клиентском коде. Поэтому, когда вы это сделаете, вам также нужно убедиться, что вы установили флаг Specified в значение true, иначе эти свойства не будут сериализованы.

Таким образом, чтобы предотвратить создание этих флагов для типов значений, вам необходимо изменить контракт, чтобы сделать эти свойства типов значений обязательными, а не необязательными.

Надеюсь, что это имеет смысл.

0 голосов
/ 03 декабря 2013

ПРИМЕЧАНИЕ: я понимаю, что это старый вопрос. Я добавляю это здесь, потому что этот вопрос является лучшим результатом в Google, и это полезная информация для тех, кто ищет.

Попробуйте добавить эту строку в декларацию вашего операционного контракта:
[XmlSerializerFormat]

Это должно выглядеть примерно так:

namespace WebServiceContract
{
    [ServiceContract(Namespace = "http://namespace")]
    [XmlSerializerFormat] //This line here will cause it to serialize the "optional" parameters correctly, and not generate the extra
    interface InterfaceName
    {
        /*...Your web service stuff here...*/
    }
}
0 голосов
/ 15 января 2010

ОК. Я нашел одну вещь, которая вызовет генерацию Specified свойств:

  • Наличие XTypedElement в сообщении.

Они используются Linq2XSD. Я возвращал элемент из модели Linq2XSD.

Это вызвало Specified свойства, которые будут созданы ВСЕ во всех моих классах:

    public XTypedElement Foo { get; set; }

Однако это не так:

    public XElement Foo { get; set; }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...