2012-09-05 20 views
8

Estoy ejecutando una publicación programada de mi base de datos principal de Sitecore utilizando la API de publicación de Sitecore. Que llamo un servicio web a intervalos regulares durante el día, que se ejecuta el siguiente código (ligeramente condensada para facilitar la lectura):¿Por qué Sitecore publica los artículos del borrador de la API de C# y cómo lo detengo al hacerlo?

// grab the root content node from sitecore 
Item contentNode = dbSource.Items[ID.Parse("{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}")]; 

PublishOptions options = new PublishOptions(sourceDatabase, targetDatabase, PublishMode.Smart, lang, DateTime.Now); 

options.RootItem = contentNode; 

options.Deep = true; 

Publisher p = new Publisher(options); 

p.PublishAsync(); 

Cuando corremos el código anterior se publica todo en el nodo de contenido, incluyendo todos los descendientes, independientemente de estado del flujo de trabajo. Es como si estuviera ignorando el flujo de trabajo por completo. Esto no es lo que buscamos, y está causando muchos problemas en nuestro sitio web en vivo.

Si ejecutamos la misma acción desde Sitecore Desktop, publica todo en el nodo de contenido, incluidos todos los descendientes, que son publicables (es decir, en la etapa final del flujo de trabajo). No publica ningún elemento en el árbol que todavía esté en modo borrador. Este es el comportamiento requerido.

que han intentado implementar el código como un usuario que no es administrador rodeando el código anterior con la siguiente instrucción using:

string userName = @"sitecore\******"; 

Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, true); 

user.RuntimeSettings.IsAdministrator = false; 

using (new Sitecore.Security.Accounts.UserSwitcher(user)) 
{ 
    ... 
} 

Desafortunadamente, esto ha tenido ningún efecto.

¿Hay algo obvio que he echado de menos, o lo estoy haciendo bien y Sitecore lo está haciendo mal? ¿Alguien puede ayudar, por favor?

Lo extraño que noté, también, es que los artículos del borrador que se publicaron, cuando se vieron en la base de datos en vivo, no mostraban absolutamente nada en el escritorio de Sitecore en términos de campos o metadatos. También estaban mostrando una advertencia de que "El elemento actual no tiene una versión en 'Inglés:. Inglés'

+0

No necesita servicio para esto. Sitecore tiene su propio programador. –

+2

Gracias @horseman, pero creo que el programador integrado de Sitecore funciona en un intervalo, que puede restablecerse fácilmente cuando se recicla el ASP.NET AppPool. Esto puede estropear los horarios adecuados que pueda tener para publicar. Como resultado, utilizamos un servicio web que se llama según un programa del Programador de tareas de Windows. – theyetiman

Respuesta

4

TL; DR nodo raíz de contenido tenían la versión en otro idioma, la eliminación de esa versión, o únicamente a publicar en Inglés lenguaje impedido la publicación de artículos en modo borrador

OK, así que después de tratar de @ techphoria414 código sugirió , se hizo evidente que el contexto no era el problema. Después de todo, el editor se estaba apegando al flujo de trabajo, pero el problema ha resultado ser que el nodo de contenido raíz tiene una versión en otro idioma (japonés, no me pregunten cómo llegó esto), pero los nodos descendientes no tienen versiones en japonés en absoluto. De hecho, nuestra base de datos maestra solo está configurada para tener el inglés como idioma, por lo que no debería ser posible que un usuario que no sea el administrador agregue una versión en otro idioma.

Realicé algunas pruebas y descubrí que el editor ignora el flujo de trabajo para los elementos que existen en otro idioma.Tenga en cuenta la situación siguiente:

1) Agregue una carpeta y cualquier elemento debajo ("elemento de flujo de trabajo de prueba") que tenga flujo de trabajo. No confíe el elemento, dejándolo en la versión 1, en modo borrador (es decir, no debería ser publicable). La carpeta contiene sólo tiene una versión en un idioma (Inglés):

You add a folder and any item underneath which has workflow Folder has english version only

2) publicada la carpeta con un profundo publicar en su base de datos web (utilizando el código en mi pregunta). Esto da como resultado lo siguiente (se agregó la carpeta, pero el borrador "elemento de flujo de trabajo de prueba" no se agregó). Este es el comportamiento esperado - ¡yay!

You publish the folder with a deep publish

3) Añadir una nueva versión a la carpeta que contiene en un idioma diferente.

Add a new version to the containing folder in a different language

4) Comprobar el estado de flujo de trabajo del elemento hijo ahora que los japoneses es seleccionado como el idioma. Observe que en el canal ya no dice que está en modo borrador, pero no hay ninguna versión en japonés (como se ve a la derecha).

Check the workflow state of the child item now that Japanese is selected as the language

5) Publicar la carpeta que contiene en todos los idiomas a la db web, exactamente igual que antes. Observe ahora que el "elemento de flujo de trabajo de prueba" se ha publicado, pero sin versiones. Esto es lo que ocurrió con nuestra publicación, excepto desde el nodo de contenido de raíz lo que significaba un sinnúmero de artículos consiguieron publicaron que no debería haber sido publicada

Publish again using the exact same code

Ahora, ¿por qué nuestra nodo raíz de contenido tiene una versión en japonés es un completo misterio, pero al menos hemos descubierto por qué nuestros artículos del borrador se publicaron para que podamos evitarlo en el futuro. Sospecho que tiene algo que ver con la actualización de Sitecore, ya que hay 2 versiones en japonés que corresponden aproximadamente a las fechas de actualización en los últimos 2 años.

+0

Respuesta bien documentada. Esto es en realidad el comportamiento esperado, y una razón por la cual es importante verificar item.Versions.Count> 0 en tu código antes de mostrar el contenido. Una verificación nula no es suficiente. – techphoria414

+2

Gracias por esto. Se metió en el mismo problema. Nodo de "contenido" predeterminado tenía versiones en japonés, alemán y danés ... ¿qué diablos? No hay otros idiomas definidos en Sistema/Idiomas aparte del inglés. Totalmente y totalmente en desacuerdo con que debería tener que comprobar explícitamente si item.Versions.Count> 0 cada vez que renderizo algo. ¡Ridículo! ¡ESPECIALMENTE cuando esas versiones NO aparecen en el Editor de contenido! – Bryan

14

Probablemente el problema es que su servicio web no se está ejecutando en un contexto sitio que ha permitido el flujo de trabajo

.

la forma más sencilla de hacerlo dentro de su código es utilizar un SiteContextSwitcher para cambiar al sitio "cáscara"

using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell"))) 
{ 
    //do your publish 
} 

En cuanto a los artículos publicados sin versiones:. En teoría, eso sería todavía ocurrir incluso con la publicación periódica El flujo de trabajo limita la publicación de las versiones de los elementos, no de los elementos en sí mismos. En su código, al iterar elementos y en en otros casos, debe verificar si item.Versions.Count > 0 antes de renderizar.

+0

+1. Tuve el mismo problema y el problema fue que mi código se estaba ejecutando en el contexto del sitio "programador" que no tiene flujo de trabajo. Peor aún, el método 'Item.Publishing.IsPublishable()' devolverá verdadero si/cuando el flujo de trabajo de un elemento no está disponible. Descubrí esto de la manera difícil ... no es uno de mis mejores días. –

+0

Muchas gracias, esto parece completamente plausible ya que es un servicio de WCF. Voy a darle un vistazo en breve para ver si funciona y me pondré en contacto contigo. Lo extraño que noté, también, es que los artículos del borrador que se publicaron, cuando se vieron en la base de datos en vivo, no mostraban absolutamente nada en el escritorio de Sitecore en términos de campos o metadatos. También mostraban una advertencia de que "el elemento actual no tiene una versión en" inglés: inglés ". – theyetiman

+0

En teoría, eso sucedería incluso con la publicación regular. Workflow limita la publicación de las versiones de los artículos, no los artículos mismos. su código, al iterar elementos y en otros casos, debe verificar si item.Versions.Count> 0 antes de renderizar. – techphoria414

Cuestiones relacionadas