Pergunta

Eu sou um novato no WCF, atualmente estou desenvolvendo um serviço TCP WCF e eu não tenho certeza que eu entendo passar parâmetros corretamente ou não, então eu recomendo que você para comentar e dar uma forma padronizada.

Para obter as coisas claras eu desenvolvi um pequeno serviço para testar propósito que tem um método único e depende de um link externo .Net dll que expõe classe única. O código de contrato de serviço

    [ServiceContract]
    public  interface IMyService
    {
        [OperationContract]
        int Test1(actionType at, calculationType ct, action a);
        [OperationContract]
        int Test2(DataSeries s);
    }

Onde actionType, calculationType, action são enums declarados dentro da DLL externa e DataSeries é uma classe declarada dentro da dll.

O defination origianl para a classe DataSeries na dll é marcada por [Serializable] somente e não [DataMember] aos seus membros.

Eu estou usando o 3º dll no lado do cliente e servidor, a minha surpresa foi ambas as aplicações funcionando bem, sem colocar [DataContract] na classe DataSeries e sem utilizar qualquer um dos [EnumMember] dentro enums, [DataMember] dentro da classe.

Então, o que está acontecendo?

Outra experiência:

A remoção do 3o partido do lado do cliente e usando o serviço, pois é Eu achei que o vs2008 gera os enums e da classe DataSeries e markes-los com os atributos adequados? como

    [System.CodeDom.Compiler.GeneratedCodeAttribute      ("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="actionType",  Namespace="http://schemas.datacontract.org/2004/07/DBInterface")]
    public enum actionType : int {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        All = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Buy = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Sell = 2,
    }
Foi útil?

Solução

DataContract , DataMember e atributos EnumMember são usados ??pelo DataContractSerializer (geralmente basicHttpBinding ou wsHttpBinding ). Se você está expondo um ponto final com TCP ligação ( netTcpBinding ), apenas SerializableAttribute é necessária. Note-se que com DataContractSerializer você só poderia adicionar SerializableAttribute às suas aulas e vai serializar automaticamente todos os campos.

Eu recomendo que você o seguinte: se você quiser que o seu serviço para ser interoperável, basicHttpBinding uso e marcar suas aulas com DataContract e DataMember atributos. Se o seu cliente é um aplicativo .NET, use netTcpBinding e marcar suas aulas com SerializableAttribute.

Você também pode ler este pós para comparação entre ligações diferentes.

Outras dicas

Mas sem usar DataContract ou qualquer atributos, achei lado do cliente funcionando corretamente

Sim, isso é verdade - se os tipos de dados que você usa não são marcadas com o [DataContract], WCF vai tentar usar o serializador SABÃO padrão sobre eles e apenas tudo serialize que é (todas as propriedades públicas) públicas

Ele funciona - mas pode não ser o que você quer / espera - então eu acho opinião segundo Darin - basta usar sempre explícitas atributos [DataContract] em seus tipos. O mais claro que você faça sua intenção de si mesmo (ou outros programadores que precisam manter o seu código mais tarde), o melhor. Esses "truques de mágica" que acontecem nos bastidores tendem a causar confusão às vezes - você é melhor fora de não contando com eles demasiado

Marc

Então, para mim eu uso [DataContract] s, e passar por um único parâmetro, e retornar uma volta contrato de dados.

Isso dá mais flexibilidade, como eu pode estender o contrato de dados com novos atributos opcionais para o contrato de dados, sem quebrar todos os clientes existentes.

Enums Eu também criar dados de contatos para obter; porque então eu posso fazer o mesmo, estendendo a enumeração sem quebrar nada, e eu posso controlar o namespace.

[DataContract(Namespace = "http://namespace.mydomain.com/2009/05", Name = "ReferenceTypeData")]
public enum GenderEnum
{
    [EnumMember()]
    Unknown = 0,
    [EnumMember()]
    Male = 1,
    [EnumMember()]
    Female = 2
}

Você deve então marcar o contrato de serviço com

[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top