Quiero devolver un tipo anónimo sobre WCF. es posible?WCF y tipos anónimos
Respuesta
No, no lo es. Tendrá que definir sus tipos antes de tiempo.
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?? –
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
No puede devolver un tipo anónimo de cualquier método, ¿o sí? Entonces, ¿por qué podría devolverlo desde WCF?
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 ... –
No del todo. Puede devolver tipos anónimos como "objeto", y esto funciona bien con la API web y el serializador JSON. –
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". –
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
Los mensajes personalizados son probablemente el camino a seguir para este. +1 – Randolpho
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)]
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.
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.
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;
- 1. tipos anónimos y genéricos
- 2. tipos anónimos
- 3. IQueryable para tipos anónimos
- 4. ¿Colecciones de tipos anónimos?
- 5. Tipos anónimos y Obtener acceso en WP7.1?
- 6. polimorfismo, genéricos y tipos anónimos C#
- 7. jugar con los tipos anónimos
- 8. Declaración de tipos anónimos Lista
- 9. Opción Los tipos estrictos y anónimos no van juntos?
- 10. JAXB: tipos simples anónimos como enumeraciones?
- 11. ¿Puedo serializar tipos anónimos como xml?
- 12. Optimizaciones del compilador de tipos anónimos
- 13. ¿Tipos anónimos a una matriz de objetos?
- 14. Devolver tipos anónimos con API web
- 15. Rendimiento de tipos anónimos en C#
- 16. Tipos anónimos - ¿Hay alguna característica de distinción?
- 17. Métodos y delegados anónimos
- 18. WCF tipos comunes no reutilizados
- 19. WCF: configuración de tipos conocidos
- 20. Enlace de datos de Silverlight 4 con tipos anónimos
- 21. ¿Por qué tipos anónimos equivale a la implementación compara campos?
- 22. C# solicitud de función: implementar interfaces de tipos anónimos
- 23. Cómo LINQ Distinto por múltiples campos sin tipos anónimos
- 24. distinto en LINQ con los tipos anónimos (en VB.NET)
- 25. ¿Cuál es el propósito de los tipos anónimos?
- 26. ¿Cómo deben usarse los tipos anónimos en C#?
- 27. ¿Hay alguna manera de concaturar los tipos anónimos de C#?
- 28. WCF, tipo de retorno de interfaz y tipos conocidos
- 29. Tipos de datos complejos en WCF?
- 30. Interfaces, métodos anónimos y fugas de memoria
¿Cómo sabe el cliente ¿cuál será el tipo? –
Esto es una "cosa incorrecta" que hacer, incluso si utiliza el contrato sin tipo –
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