2010-07-30 13 views
6

¿Alguien ha tenido suerte al usar un servicio web .NET para acceder a los elementos de Sitecore? Tengo varias aplicaciones web en mi servidor que todavía están en Coldfusion. Me gustaría poder llamar a un servicio web para desplegar elementos, pero cuando traté de hacerlo obtuve una excepción: "Sitecore.Data.Items.Item no se puede serializar porque no tiene un constructor sin parámetros".Acceda a los elementos de Sitecore a través del servicio web .NET

+1

No estoy seguro de que sea posible. Un Sitecore.Data.Items.Item es una clase muy robusta (léase: llena de métodos que hacen más llamadas Dcal de Sitecore) y realmente no es adecuada para ser devuelta desde un servicio web. ¿Por qué estás haciendo esto? Tal vez hay una implementación más simple? – EliThompson

+0

Definitivamente estoy abierto a algo más simple. Básicamente, tengo una serie de elementos de contenido en Sitecore que deben mostrarse en una aplicación de Coldfusion. En mi caso particular, tengo todos mis artículos de noticias en Sitecore, pero hay una serie de aplicaciones de Coldfusion que, en una forma o forma, extraen las noticias. – Kyle

+0

muchas opciones ofrecidas para responder esta Q pero no lo suficientemente claras como respuesta para darle al hombre una buena respuesta. – techphoria414

Respuesta

7

Eche un vistazo al servicio web estándar de Sitecore, lo puede encontrar en la carpeta/sitecore/shell/WebService de su solución. Ofrece algunas operaciones básicas con elementos y campos de Sitecore, pero a menudo es suficiente para extraer o guardar datos.

Espero que esto ayude.

+2

Gracias por el consejo. Creo que básicamente he llegado a la conclusión de que esto no se puede hacer sin embargo. – Kyle

+0

¿Puede explicar más por qué el servicio estándar no funcionará para usted? basado en todo lo que dices aquí, parece la mejor solución – techphoria414

+1

Estoy seguro de que funcionaría de alguna manera.La clave aquí es que quiero poder reutilizar métodos que ya he escrito para recuperar un conjunto específico de elementos que se usan dentro de un control web en una de las páginas de mi sitio. Básicamente no quiero tener dos piezas de código diferentes para mantener que hacen esencialmente lo mismo. – Kyle

2

Respondí esto también en el SDN forum. Puede crear su propio objeto contenedor que se completa con un elemento de Sitecore y establece sus miembros. La parte difícil será crear a tus miembros y asignarlos desde el elemento real de Sitecore. Si quieres todo, entonces creo que será difícil. Si solo quieres algunas cosas, entonces es factible. P.ej.

[Serializable] 
public class SitecoreItem { 
    public string ID; 
    // more members 

    SitecoreItem(Sitecore.Data.Items.Item scItem) { 
     this.ID = scItem.ID; 
     // assign more members from the true Sitecore item 
    } 

} 

Luego, en el método de WS llenar una nueva instancia con su artículo Sitecore y devolverlo:

return new SitecoreItem(actualSCItem); 
+0

Gracias, esto tiene sentido. ¿Alguna idea sobre cómo hacerla más genérica? Me gustaría tener algo que pueda usar para cualquier elemento para devolver todos los campos. Me doy cuenta de que dijiste que esto sería más difícil, pero ¿tienes alguna idea de cómo empezar a pensar en esto? – Kyle

+0

No puede serializar la clase Sitecore.Data.Items.Item, por lo que su única forma sería crear un contenedor y hacer el trabajo de asignar los miembros. Sin embargo, esta solución es genérica si se toma el tiempo de revisar todas las propiedades. La única otra opción sería usar el WS Yan incorporado mencionado –

+0

¿Se puede serializar la clase Fields? Esta sería la clave para mí. Necesito obtener toda la información de campo y no todas las plantillas contienen los mismos campos. – Kyle

1

Si tanto el serializador y el deserialiser tienen acceso a la base de datos de Sitecore, entonces muy posible Cree fácilmente un contenedor que solo serialice la ID, el nombre de la base de datos, la versión y el idioma. Luego, después de la deserialización en el otro extremo, puede volver a buscar el mismo elemento de Sitecore de la base de datos usando esa información.

Si el deserializador no tiene acceso a la base de datos, entonces realmente depende de cuáles sean sus necesidades para utilizar los datos. Normalmente recorro todos los campos (recuerde utilizar primero el item.Fields.ReadAll()) y los guardo en un diccionario para facilitar el acceso. Para la serialización, la convierto en un List<T> de pares de valores clave e ignoro el miembro Dictionary (ya que no se puede serializar) y luego lo vuelvo a llenar en la deserialización. También conservo algunas otras propiedades como ID, Idioma, Versión, Plantilla, Ruta, etc. en la clase.

Alternativamente, si crea una biblioteca de clase de modelo completa para que cada plantilla se asigne a una clase (algunas personas lo hacen), puede (probablemente) serializarlas directamente ya que (probablemente) ya no están vinculadas a una Artículo de Sitecore.

+0

Todo lo de la biblioteca de la clase es exactamente lo que hacemos. Cada plantilla tiene una clase y cada campo está asignado a una propiedad. Hicimos una herramienta en Sitecore para construir estos automáticamente. Recomiendo ese enfoque, pero solo si puedes automatizarlo. Si no es así, entonces es tan tedioso como crear el contenedor para cada miembro del elemento de Sitecore. –

Cuestiones relacionadas