Pergunta

Eu tenho uma aula simples, digamos "equipe" e exponho um serviço WCF (BasichttpBinding, hospedado no IIS) com uma operação GetTeams que retorna uma variedade de equipes.

A turma da equipe se parece

[DataContract]
public class Team
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public Point Position { get; set; }
    [DataMember]
    public string Code { get; set; }
    [DataMember]
    public bool Available { get; set; }
    [DataMember]
    public string Extra { get; set; }
    [DataMember]
    public double X { get; set; }
    [DataMember]
    public double Y { get; set; }
}

No cliente (Silverlight 3.0 App), recebo todos os dados, mas a propriedade de posição contém uma instância de ponto padrão. A estrutura de pontos é System.windows.media.point que é serializável. Também adicionei as propriedades X e Y para duplicar os dados de posição para verificar se eles acertam na outra extremidade do fio.

O XML interceptou (obrigado, Firebug!) Parece assim:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
    <GetTeamsResponse xmlns="http://tempuri.org/">
        <GetTeamsResult xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Data" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:Team>
                <a:Code>A23HJGF23</a:Code>
                <a:Available>true</a:Available>
                <a:Extra i:nil="true"/>
                <a:Id>1</a:Id>
                <a:Position xmlns:b="http://schemas.datacontract.org/2004/07/System.Windows">
                    <b:_x>572194.59937858</b:_x>
                    <b:_y>322518.3889979</b:_y>
                </a:Position>
                <a:X>572194.59937858</a:X>
                <a:Y>322518.3889979</a:Y>
            </a:Team>
            <!-- other <a:Team> elements -->
        </GetTeamsResult>
    </GetTeamsResponse>
</s:Body>
</s:Envelope>

Portanto, parece que há uma questão de deserialização. Nenhuma exceção é lançada!

Por quê?

Foi útil?

Solução

Assim como um esclarecimento rápido, o seu serviço WCF está retornando a classe .NET 3 / 3.5 Point, enquanto o SL está tentando usar a classe SLT Point? Ou ambos estão se referindo à mesma estrutura de pontos.

Estou pensando que você está passando a versão .NET para a versão SL porque esse espaço para nome na posição Datacontract parece indicar o seu uso do ponto CLR / WPF, que não é o mesmo que o ponto SL.

O WCF Endpoint usará o iserializável para alterar para o XMLSerializer em vez do serializador de contrato de dados, para que você verá os dados, mas como uma classe personalizada com o _x e _y que você vê no XML atualmente.

Editar:

Para clareza sobre o local da estrutura

SL3 Point Struct está em System.windows.dll (http://msdn.microsoft.com/en-us/library/system.windows.point(vs.95).aspx) .NET 3.0 Point Struct está no windowsbase.dll (http://msdn.microsoft.com/en-us/library/system.windows.point(vs.85).aspx) .NET 3,5 Point Struct no windowsbase.dll (http://msdn.microsoft.com/en-us/library/system.windows.point.aspx)

O mesmo nome, não é a mesma classe, no entanto, ao comparar o .NET com o SL.

E um pouco de adição, ocorrendo no SL 2.0 e sendo relatado no site do SL. (http://silverlight.net/forums/t/26577.aspx)

Outras dicas

Parece que o cliente não reconhece o tipo de dados Ponto.

À medida que você aponta, o System.Windows.media.point está no .NET 3.0 e Silverlight.

Você pode tentar declarar o ponto como sistema.windows.media.point em seu contrato de dados. Também verifique se as DLLs necessárias são referenciadas no projeto do cliente.

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