2009-10-14 12 views
7

Quiero devolver un tipo anónimo sobre WCF. es posible?WCF y tipos anónimos

+0

¿Cómo sabe el cliente ¿cuál será el tipo? –

+0

Esto es una "cosa incorrecta" que hacer, incluso si utiliza el contrato sin tipo –

+2

Aquí hay un par de ideas sobre por qué alguien podría necesitar esto. 1. El cliente podría ser Javascript manejando respuestas JSON, sin tener idea del tipo de todos modos. 2. Se podría querer hacer solicitudes "genéricas" a WCF sin tener que mantener numerosos tipos de respuestas. Es triste que solo la respuesta (positiva) (@ dave-ward) hasta ahora parece carecer de detalles de configuración que realmente lo hacen posible. – tishma

Respuesta

0

No, no lo es. Tendrá que definir sus tipos antes de tiempo.

+0

OK, lo entiendo. Pero si defino un tipo - MyObj - para este propósito y marque sus miembros IsRequired = false, ¿cómo puedo crear + enviar a través de una instancia de MyObj con solo algunos de sus miembros? ¿¿Es posible?? –

+0

Ver las respuestas de Eugene Osovetsky o marc_s. Cualquiera de las rutas te ayudará. Yo diría que la respuesta de marc_s es probablemente la mejor para tu problema. – Randolpho

3

No puede devolver un tipo anónimo de cualquier método, ¿o sí? Entonces, ¿por qué podría devolverlo desde WCF?

+0

No entiendo este voto negativo: John tiene toda la razón, los tipos anónimos no pueden devolverse desde ningún método .NET, solo puede usarlos ** dentro de ** su método actual. Por qué un downvote para una respuesta 100% correcta ... –

+0

No del todo. Puede devolver tipos anónimos como "objeto", y esto funciona bien con la API web y el serializador JSON. –

+0

Esta pregunta es sobre WCF en general, no sobre Web API. Además, el formato JSON incluye los nombres de campo. Se puede serializar y deserializar bien para JavaScript. Pero intente serializar el valor de cadena "20" se deserializará como una cadena o un número entero. No importa Javascript pero probablemente sea C#. Tenga cuidado de cómo se define "funciona bien". –

4

No puede usar tipos anónimos, pero ¿tal vez está hablando de WCF y mensajes sin tipo?

Existe una opción en WCF para definir un parámetro del tipo Message (y posiblemente un valor de retorno del mismo tipo). Este es solo el mensaje en bruto que va a WCF (y regresa de él).

No puedo encontrar mucha información buena por ahí; hay algo de documentación en MSDN, pero la mejor que he visto hasta ahora es la publicación de blog de Kurt Claeys WCF : Untyped messages on WCF operations.

No recomendaría usar este enfoque - es mucho más arduo trabajar con los contenidos del mensaje directamente usted mismo y eso es lo que WCF está tratando de evitarnos - pero si usted absolutamente, positivamente tiene que retocar cada bit de su mensaje - Esto parece ser el camino a seguir.

Marc

+0

Los mensajes personalizados son probablemente el camino a seguir para este. +1 – Randolpho

1

OK, lo entiendo. Pero si defino un tipo - MyObj - para este propósito y marque sus miembros IsRequired = false, ¿cómo puedo crear + enviar a través de una instancia de MyObj con solo algunos de sus miembros ? ¿¿Es posible??

Tome un vistazo a [DataMember(EmitDefaultValue=false)]

0

definitivamente se puede volver tipos anónimos. Esto funciona, por ejemplo:

public object GetLatestPost() 
{ 
    XDocument feedXML = XDocument.Load("http://feeds.encosia.com/Encosia"); 

    var posts = from feed in feedXML.Descendants("item") 
        select new 
        { 
        Title = feed.Element("title").Value, 
        Link = feed.Element("link").Value, 
        Description = feed.Element("description").Value 
        }; 

    return posts.First(); 
} 

Si se llama a ese método como WebMethod una de ASMX ScriptService, obtendrá este JSON de ella:

{"d": 
    {"Title":"Using an iPhone with the Visual Studio development server", 
    "Link":"http://feeds.encosia.com/~r/Encosia/~3/vQoxmC6lOYk/", 
    "Description":" Developing iPhone-optimized portions of an ASP.NET ..."}} 

Se puede utilizar un tipo de retorno de IEnumerable para volver una colección de tipos anónimos también.

+4

No se puede hacer que esto funcione en .NET 4 WCF. Voy a seguir pirateando aunque ... – vlad259

+0

¿Algún éxito aquí? Sigo recibiendo el error 504 en lugar de la respuesta. – tishma

1

Parece que no puede hacerlo con el serializador XML debido a alguna queja sobre un constructor sin parámetros pero funciona para el serializador json si está sirviendo a un cliente ajax como lo indicó Dave Ward.

0

Puede usar ExpandoObject. Cuando se define una propiedad en un DTO como ExpandoObject se genera el cliente como diccionario:

Contrato DTO

public class TaskDTO 
{ 
    public string Type { get; set; } 
    public ExpandoObject Args { get; set; } 
    public string Id { get; set; } 
    public TaskDTO SuccessTask { get; set; } 
    public TaskDTO FailTask { get; set; } 
    public bool IsFinal { get; set; } 
} 

cliente

using (var client = new JobServiceClient()) 
{ 
    var task = new TaskDTO 
    { 
     Id = Guid.NewGuid().ToString(), 
     Type = "SendEmailTask", 
     IsFinal = true 
    }; 
    dynamic args = new ExpandoObject(); 
    args.To = "[email protected]"; 
    args.Title = "test job service"; 
    args.Content = "test job service"; 
    task.Args = ((IDictionary<string, object>)args).ToDictionary(i => i.Key, i => i.Value); 
    client.Execute(task); 
} 

Servicio

dynamic args = dto.Args; 
Cuestiones relacionadas