Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un flujo de trabajo puede ejecutarse de tres maneras:
Hospedado en WorkflowServiceHost
Ejecutado como WorkflowApplication
Ejecutado directamente mediante WorkflowInvoker
Dependiendo de la opción de hospedaje del flujo de trabajo, se puede agregar un participante de seguimiento a través del código o a través de un archivo de configuración. En este tema se describe cómo se configura el seguimiento agregando un participante de seguimiento a WorkflowApplication y a WorkflowServiceHost, y cómo habilitar el seguimiento al usar WorkflowInvoker.
Configuración del seguimiento de aplicaciones de flujo de trabajo
Un flujo de trabajo se puede ejecutar mediante la WorkflowApplication clase . En este tema se muestra cómo se configura el seguimiento para una aplicación de flujo de trabajo de .NET Framework 4.6.1 agregando un participante de seguimiento al host de WorkflowApplication flujo de trabajo. En este caso, el flujo de trabajo se ejecuta como una aplicación de flujo de trabajo. Configure una aplicación de flujo de trabajo mediante código (en lugar de utilizar un archivo de configuración), que es un archivo .exe auto-hospedado usando la clase WorkflowApplication. El participante de rastreo se agrega como una extensión a la instancia WorkflowApplication. Para ello, agregue el TrackingParticipant a la colección de extensiones de la instancia de WorkflowApplication.
Para una aplicación de flujo de trabajo, puede agregar la EtwTrackingParticipant extensión de comportamiento como se muestra en el código siguiente.
LogActivity activity = new LogActivity();
WorkflowApplication instance = new WorkflowApplication(activity);
EtwTrackingParticipant trackingParticipant =
new EtwTrackingParticipant
{
TrackingProfile = new TrackingProfile
{
Name = "SampleTrackingProfile",
ActivityDefinitionId = "ProcessOrder",
Queries = new WorkflowInstanceQuery
{
States = { "*" }
}
}
};
instance.Extensions.Add(trackingParticipant);
Configuración del seguimiento del servicio de flujo de trabajo
Un flujo de trabajo se puede exponer como un servicio WCF cuando se hospeda en el host del WorkflowServiceHost servicio. WorkflowServiceHost es una implementación especializada de ServiceHost de .NET para un servicio basado en flujo de trabajo. En esta sección se explica cómo configurar el seguimiento de un servicio de flujo de trabajo de .NET Framework 4.6.1 que se ejecuta en WorkflowServiceHost. Se configura a través de un archivo Web.config (para un servicio hospedado en web) o un archivo de App.config (para un servicio hospedado en una aplicación independiente, como una aplicación de consola) especificando un comportamiento de servicio o mediante código agregando un comportamiento específico de seguimiento a la Behaviors colección para el host de servicio.
Para un servicio de flujo de trabajo hospedado en WorkflowServiceHost, puede agregar el EtwTrackingParticipant<behavior
> mediante un elemento en un archivo de configuración, como se muestra en el ejemplo siguiente.
<behaviors>
<serviceBehaviors>
<behavior>
<etwTracking profileName="Sample Tracking Profile" />
</behavior>
</serviceBehaviors>
</behaviors>
Por otra parte, en el caso de un servicio de flujo de trabajo hospedado en WorkflowServiceHost, puede agregar la extensión de comportamiento EtwTrackingParticipant a través del código. Para agregar un participante de seguimiento personalizado, cree una nueva extensión de comportamiento y agréguela al ServiceHost como se muestra en el código de ejemplo siguiente.
Nota:
Si desea ver el código de ejemplo que muestra cómo crear un elemento de comportamiento personalizado que agrega un participante de seguimiento personalizado, consulte los ejemplos de seguimiento .
ServiceHost svcHost = new ServiceHost(typeof(WorkflowService), new
Uri("http://localhost:8001/Sample"));
EtwTrackingBehavior trackingBehavior =
new EtwTrackingBehavior
{
ProfileName = "Sample Tracking Profile"
};
svcHost.Description.Behaviors.Add(trackingBehavior);
svcHost.Open();
El participante de seguimiento se agrega al host del servicio de flujo de trabajo como una extensión del comportamiento.
Este código de ejemplo siguiente muestra cómo leer un perfil de seguimiento del archivo de configuración.
TrackingProfile GetProfile(string profileName, string displayName)
{
TrackingProfile trackingProfile = null;
TrackingSection trackingSection = (TrackingSection)WebConfigurationManager.GetSection("system.serviceModel/tracking");
if (trackingSection == null)
{
return null;
}
profileName ??= "";
//Find the profile with the specified profile name in the list of profile found in config
var match = from p in new List<TrackingProfile>(trackingSection.TrackingProfiles)
where (p.Name == profileName) && ((p.ActivityDefinitionId == displayName) || (p.ActivityDefinitionId == "*"))
select p;
if (match.Count() == 0)
{
//return an empty profile
trackingProfile = new TrackingProfile()
{
ActivityDefinitionId = displayName
};
}
else
{
trackingProfile = match.First();
}
return trackingProfile;
Este código de ejemplo muestra cómo agregar un perfil de seguimiento a un host de flujo de trabajo.
WorkflowServiceHost workflowServiceHost = serviceHostBase as WorkflowServiceHost;
if (null != workflowServiceHost)
{
string workflowDisplayName = workflowServiceHost.Activity.DisplayName;
TrackingProfile trackingProfile = GetProfile(this.profileName, workflowDisplayName);
workflowServiceHost.WorkflowExtensions.Add(() => new EtwTrackingParticipant {
TrackingProfile = trackingProfile
});
}
Nota:
Para obtener más información sobre los perfiles de seguimiento, consulte Perfiles de seguimiento.
Configuración del seguimiento mediante WorkflowInvoker
Para configurar el seguimiento de un flujo de trabajo ejecutado mediante WorkflowInvoker, agregue el proveedor de seguimiento como una extensión a una instancia de WorkflowInvoker. El ejemplo de código siguiente es del ejemplo de seguimiento personalizado .
WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);
invoker.Invoke();
Visualización de registros de seguimiento en el Visor de eventos
Hay dos registros de visor de eventos de especial interés para ver al realizar el seguimiento de la ejecución de WF: el registro analítico y el registro de depuración. Ambos residen bajo el nodo Microsoft|Windows|Application Server-Applications. Los registros de esta sección contienen eventos de una sola aplicación en lugar de eventos que afectan a todo el sistema.
Los eventos de seguimiento de depuración se escriben en el registro de depuración. Para recopilar eventos de seguimiento de depuración de WF en el Visor de eventos, habilite el registro de depuración.
Para abrir el Visor de eventos, haga clic en Inicioy, a continuación, haga clic en Ejecutar. En el cuadro de diálogo Ejecutar, escriba
eventvwr
.En el cuadro de diálogo Visor de eventos, expanda el nodo Registros de aplicaciones y servicios .
Expanda los nodos Microsoft, Windows y Application Server-Applications .
Haga clic con el botón derecho en el nodo Depurar en el nodo Aplicaciones del servidor de aplicaciones y seleccione Habilitar registro.
Ejecute la aplicación habilitada para el seguimiento para generar eventos de seguimiento.
Haga clic con el botón derecho en el nodo Depurar y seleccione Actualizar. Los eventos de seguimiento deben estar visibles en el panel central.
WF 4 proporciona un participante de seguimiento que escribe registros de seguimiento en una sesión ETW (Seguimiento de eventos para Windows). El participante de seguimiento de ETW se configura con un perfil de seguimiento para suscribirse a registros de seguimiento. Cuando se habilita el seguimiento, los registros de seguimiento de errores se emiten en ETW. Los eventos de seguimiento de ETW (entre el rango de 100 a 113) correspondientes a los registros de seguimiento emitidos por el participante de seguimiento de ETW se escriben en el Registro Analítico.
Para ver los registros de seguimiento, siga estos pasos.
Para abrir el Visor de eventos, haga clic en Inicioy, a continuación, haga clic en Ejecutar. En el cuadro de diálogo Ejecutar, escriba
eventvwr
.En el cuadro de diálogo Visor de eventos, expanda el nodo Registros de aplicaciones y servicios .
Expanda los nodos Microsoft, Windows y Application Server-Applications .
Haga clic con el botón derecho en el nodo Análisis en el nodo Aplicaciones del servidor de aplicaciones y seleccione Habilitar registro.
Ejecute la aplicación habilitada para el seguimiento para generar registros de seguimiento.
Haga clic con el botón derecho en el nodo Analítico y seleccione Actualizar. Los registros de seguimiento deben estar visibles en el panel central.
En la imagen siguiente se muestran los eventos de seguimiento en el visor de eventos:
Registro de un identificador de proveedor específico de la aplicación
Si es necesario escribir eventos en un registro de aplicación específico, siga estos pasos para registrar el nuevo manifiesto del proveedor.
Declare el identificador de proveedor en el archivo de configuración de la aplicación.
<system.serviceModel> <diagnostics etwProviderId="2720e974-9fe9-477a-bb60-81fe3bf91eec"/> </system.serviceModel>
Copie el archivo de manifiesto de %windir%\Microsoft.NET\Framework\<versión más reciente de .NET Framework 4.6.1>\Microsoft.Windows.ApplicationServer.Applications.man a una ubicación temporal y cámbiele el nombre a Microsoft.Windows.ApplicationServer.Applications_Provider1.man.
Cambie el GUID del archivo de manifiesto por el nuevo GUID.
<provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" />
Cambie el nombre del proveedor si no desea desinstalar el proveedor predeterminado.
<provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" />
Si ha cambiado el nombre del proveedor en el paso anterior, cambie los nombres de canal del archivo de manifiesto al nuevo nombre de proveedor.
<channel name="Microsoft-Windows-Application Server-Applications_Provider1/Admin" chid="ADMIN_CHANNEL" symbol="ADMIN_CHANNEL" type="Admin" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ADMIN_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Operational" chid="OPERATIONAL_CHANNEL" symbol="OPERATIONAL_CHANNEL" type="Operational" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.OPERATIONAL_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Analytic" chid="ANALYTIC_CHANNEL" symbol="ANALYTIC_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ANALYTIC_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Debug" chid="DEBUG_CHANNEL" symbol="DEBUG_CHANNEL" type="Debug" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.DEBUG_CHANNEL.message)" /> <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Perf" chid="PERF_CHANNEL" symbol="PERF_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.PERF_CHANNEL.message)" />
Genere el archivo DLL de recursos siguiendo estos pasos.
Instale Windows SDK. Windows SDK incluye el compilador de mensajes (mc.exe) y el compilador de recursos (rc.exe).
En un símbolo del sistema de Windows SDK, ejecute mc.exe en el archivo de manifiesto nuevo.
mc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.man
Ejecute rc.exe en el archivo de recursos generado en el paso anterior.
rc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.rc
Cree un archivo cs vacío denominado NewProviderReg.cs.
Cree un archivo DLL de recursos mediante el compilador de C#.
csc /target:library /win32res:Microsoft.Windows.ApplicationServer.Applications_Provider1.res NewProviderReg.cs /out:Microsoft.Windows.ApplicationServer.Applications_Provider1.dll
Cambie el nombre del archivo dll de mensajes y de recursos en el archivo de manifiesto de
Microsoft.Windows.ApplicationServer.Applications.Provider1.man
por el nuevo nombre de archivo dll.<provider name="Microsoft-Windows-Application Server-Applications_Provider1" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" symbol="Microsoft_Windows_ApplicationServer_ApplicationEvents" resourceFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll" messageFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll" />
Use wevtutil para registrar el manifiesto.
wevtutil im Microsoft.Windows.ApplicationServer.Applications_Provider1.man