Pergunta

Eu estou usando um HashSet na minha interface WCF

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

Quando eu criar uma referência de serviço as voltas HashSet em um int [].

Eu adicionei uma ServiceKnownType:

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

e tentou alguma configuração, mas não conseguia fazê-lo para a mudança.

Se eu mudá-lo embutido tudo funciona, mas é realmente irritante para mudá-la cada vez que uma atualização minha referência ..

Eu sou provavelmente fazendo algo errado, qualquer ponteiros ou idéias?

Foi útil?

Solução

Coleções são simplificadas quando vão ao longo do fio. Você pode especificar o tipo de coleção através do IDE e de linha de comando (svcutil /collectionType), mas será aplicada a todas coleções na API. Eu acho que você deve apenas aceitá-lo e lidar com a incompatibilidade através de código. Em última análise, no fio, coleções são apenas xml (sobre as ligações padrão, pelo menos) - algo como:

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

-., Portanto, por que ele não pode dizer (do esquema) entre um array (T[]), um List<T>, um HashSet<T>, e uma MyFunkyCollection<T>

Note que se você usar a montagem compartilhar (ou seja, o mesmo contrato de serviço de montagem é no cliente e servidor), então isso não vai acontecer - mas que derrota a intenção de SOA / mex. Mas está é uma abordagem utilizada bastante -., Portanto, os suportes IDE-lo diretamente, e de linha de comando através de um interruptor (svcutil /reference)


Para o IDE apoiá-lo ... se você escrever o contrato de serviço e contrato de dados em uma biblioteca de classe (DLL), e em seguida, adicione uma referência de assembly (ou seja, uma referência dll ou uma referência de projeto) para esta biblioteca dos dois projetos (o projeto do servidor eo projeto do cliente). Agora adicione um referência de serviço do projeto cliente ao ponto de extremidade do servidor (o .svc). Se você estiver usando VS2008, ele vai verificar automaticamente referências locais para tipos e usar aqueles no lugar de geração de proxy - ou seja:. O código do cliente usa o IwcfServerSync a partir da biblioteca de classes, que já sabe se deve usar HashSet<T> etc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top