Как предотвратить создание свойств "Указанных" в WCF-клиентах?

У меня есть две службы WCF.NET 3.5 с 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-службе (все на той же машине с локальным хостом), что иногда я получаю свойства "Определенные", а иногда нет. Я больше не думаю (как я подозревал изначально), что это связано только с некоторой конфигурацией конечной точки или уровнем обслуживания [attribute]. Есть определенные триггеры в самом сообщении, которые вызывают Specified для создания (или нет). Может быть много факторов, или это может быть что-то очень простое.

Ответ 1

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

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

IsRequired=true будет отрицать необходимость свойства testEnvFieldSpecified

Ответ 2

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

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

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

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

Ответ 3

OK Я уже нашел одну вещь, которая приведет к созданию свойств Specified:

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

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

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

    public XTypedElement Foo { get; set; }

Это не так:

    public XElement Foo { get; set; }

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

Ответ 4

ПРИМЕЧАНИЕ. Я понимаю, что это старый вопрос. Я добавляю это здесь, потому что этот вопрос является лучшим результатом в 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...*/
    }
}