Tengo un servicio WCF que tiene métodos para volver IEnumerable<T> colecciones de objetos, y también un tipo complejo, OrganizationCollection, que tiene una serie de propiedades, que son cada una IEnumerable<T> de diferentes tipos. Creo que he configurado mi Contrato de Servicio correctamente, y la definición de mis tipos de DataContract /DataMember correctamente. El método que devuelve un OrganizationCollection produce una excepción. Sé que el método de las funciones ya que tengo pruebas de integración y unidad que prueba de ello. Es sólo cuando se ejecuta con un vivo y desplegado el servicio que se produce. Incluso he especificado el tipo como un ServiceKnownType, pero fue en vano. ¿Qué tengo que hacer para configurar el servicio para que sean capaces de devolver los tipos complejos como OrganizationCollection?

Nota: El servicio de WCF se está ejecutando con basicHttpBinding, y está ubicado en una ServiceHost en un Servicio de Windows.

[Sistema.ServiceModel.CommunicationException] {«ha ocurrido Un error mientras se recibe la respuesta HTTP http://localhost:8799/MyService. Esto podría ser debido a que el extremo de servicio de enlace no mediante el protocolo HTTP. Esto también podría ser debido a una petición HTTP contexto de ser anulada por el servidor (posiblemente debido a que el servicio de apagar). Ver los registros del servidor para obtener más detalles.»} Sistema.ServiceModel.CommunicationException

[ServiceBehavior(IncludeExceptionDetailInFaults = true, AutomaticSessionShutdown = false, InstanceContextMode = InstanceContextMode.Single)]
[ServiceKnownType(typeof(OrganizationCollection))]
public class MyService: IClientService
{ 
    //...
}

[ServiceContract]
public interface IClientService
{
    //This works:
    [OperationContract]
    IEnumerable<BookSvc> GetBooks(DateTime sinceDate);

    //This fails, with the above exception:
    [OperationContract]
    OrganizationCollection GetOrganizations(DateTime sinceDate);
}

BookSvc se define con [DataContract] y cada propiedad tiene [DataMember]. Esto también es cierto con el Profesor y el Estudiante clases. Las propiedades son todos los tipos primitivos. OrganizationCollection se define como:

[DataContract]
public class OrganizationCollection
{
    [DataMember]
    public IEnumerable<Teacher> Teachers { get; set; }

    [DataMember]
    public IEnumerable<Student> Students { get; set; }
}
Primero: Son sus Teacher y Student las clases marcadas como [DataContract] así? Segundo: ¿intenta cambiar los tipos de sus propiedades a Teacher[] y Student[]? Ellos deben estar plenamente de todas formas enumerado antes de que puedan ser devueltos a través de WCF.
1. Sí, el Profesor y el Estudiante están marcados como [DataContract]. 2. Puedo intentar, pero mis métodos que hacer el trabajo cuando yo ejecute también el retorno como IEnumerable<T>, pero me doy cuenta de que son independientes de los valores de retorno y no parte de un tipo complejo.
No estoy seguro, voy a dejar a alguien que le dé una informado respuesta. Acabo de sugerir algo que se podría tratar de una solución rápida. Sin embargo, no creo que IEnumerable<T> es una buena opción de diseño para este escenario de todos modos; el tipo complejo que debe ser limitada a mantener un pobladas de la colección. Yo preferiría ICollection<T> si quieres ir a por el más bajo de la interfaz.
Es posible que desee leer aquí: Colección de Tipos de Contratos de Datos.

OriginalEl autor Stealth Rabbi | 2012-02-01

1 Comentario

  1. 4

    Hay dos opciones:

    1. De hormigón tipo de colección (Lista, etc.) debe ser utilizado como valor de retorno para proporcionar el mecanismo de serialización de WCF (Tipos de colección de Datos de los Contratos, de MSDN).

    2. Utilizando conoce los tipos de datos (Contrato de datos los Tipos Conocidos, de MSDN).

    ¿Por qué es un concreto tipo de colección no es necesario cuando la devolución de IEnumerable<BookSvc> en el GetBooks() método?
    Cambiar a un duro de la Lista de<T> el tipo hizo el truco. Todavía curioso en cuanto a por qué esto era necesario. Probablemente es más seguro usar la Lista de<T> en todos los casos.
    Me alegro de que te haya ayudado. Las reglas se describen a continuación: Colección de Tipos de Contratos de Datos.

    OriginalEl autor Sergey Brunov

Dejar respuesta

Please enter your comment!
Please enter your name here