Configurando o controle para um fluxo de trabalho
Um fluxo de trabalho pode ser executado de três maneiras:
Hospedado em WorkflowServiceHost
Executado como um WorkflowApplication
Executado diretamente usando WorkflowInvoker
Dependendo da opção de hospedagem do fluxo de trabalho, um participante de acompanhamento pode ser adicionado por meio de código ou por meio de um arquivo de configuração. Este tópico descreve como o acompanhamento é configurado adicionando um participante de acompanhamento a um WorkflowApplication e a um WorkflowServiceHost, e como habilitar o acompanhamento ao usar WorkflowInvokero .
Configurando o controle de aplicativos de fluxo de trabalho
Um fluxo de trabalho pode ser executado usando a WorkflowApplication classe. Este tópico demonstra como o controle é configurado para um aplicativo de fluxo de trabalho do .NET Framework 4.6.1 adicionando um participante de controle ao host do WorkflowApplication fluxo de trabalho. Nesse caso, o fluxo de trabalho é executado como um aplicativo de fluxo de trabalho. Você configura um aplicativo de fluxo de trabalho por meio de código (em vez de usar um arquivo de configuração), que é um arquivo de .exe auto-hospedado usando a WorkflowApplication classe. O participante de acompanhamento é adicionado como uma extensão à WorkflowApplication instância. Isso é feito adicionando o TrackingParticipant à coleção de extensões para a instância WorkflowApplication.
Para um aplicativo de fluxo de trabalho, você pode adicionar a extensão de EtwTrackingParticipant comportamento conforme mostrado no código a seguir.
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);
Configurando o controle do serviço de fluxo de trabalho
Um fluxo de trabalho pode ser exposto como um serviço WCF quando hospedado no host de WorkflowServiceHost serviço. WorkflowServiceHost é uma implementação especializada do .NET ServiceHost para um serviço baseado em fluxo de trabalho. Esta seção explica como configurar o controle para um serviço de fluxo de trabalho do .NET Framework 4.6.1 em execução no WorkflowServiceHost. Ele é configurado por meio de um arquivo Web.config (para um serviço hospedado na Web) ou um arquivo App.config (para um serviço hospedado em um aplicativo autônomo, como um aplicativo de console) especificando um comportamento de serviço ou por meio de código adicionando um comportamento específico de rastreamento à Behaviors coleção para o host de serviço.
Para um serviço de fluxo de trabalho hospedado no WorkflowServiceHost, você pode adicionar o EtwTrackingParticipant usando o <behavior
> elemento em um arquivo de configuração, conforme mostrado no exemplo a seguir.
<behaviors>
<serviceBehaviors>
<behavior>
<etwTracking profileName="Sample Tracking Profile" />
</behavior>
</serviceBehaviors>
</behaviors>
Como alternativa, para um serviço de fluxo de trabalho hospedado no WorkflowServiceHost, você pode adicionar a extensão de comportamento por meio de EtwTrackingParticipant código. Para adicionar um participante de acompanhamento personalizado, crie uma nova extensão de comportamento e adicione-a ao código de exemplo a ServiceHost seguir.
Nota
Se você quiser exibir o código de exemplo que mostra como criar um elemento de comportamento personalizado que adiciona um participante de acompanhamento personalizado, consulte os Exemplos de acompanhamento .
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();
O participante de acompanhamento é adicionado ao host do serviço de fluxo de trabalho como uma extensão para o comportamento.
Este código de exemplo abaixo mostra como ler um perfil de acompanhamento do arquivo de configuração.
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 exemplo mostra como adicionar um perfil de acompanhamento a um host de fluxo de trabalho.
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 obter mais informações sobre perfis de rastreamento, consulte Perfis de rastreamento.
Configurando o acompanhamento usando WorkflowInvoker
Para configurar o acompanhamento de um fluxo de trabalho executado usando WorkflowInvokero , adicione o provedor de rastreamento como uma extensão para uma WorkflowInvoker instância. O exemplo de código a seguir é do exemplo de controle personalizado .
WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);
invoker.Invoke();
Exibindo registros de rastreamento no Visualizador de Eventos
Há dois logs do Visualizador de Eventos de particular interesse para exibir ao acompanhar a execução do WF - o log analítico e o log de depuração. Ambos residem sob a Microsoft|Janelas|Nó Servidor de Aplicativos. Os logs nesta seção contêm eventos de um único aplicativo em vez de eventos que têm impacto em todo o sistema.
Os eventos de rastreamento de depuração são gravados no log de depuração. Para coletar eventos de rastreamento de depuração do WF no Visualizador de Eventos, habilite o Log de Depuração.
Para abrir o Visualizador de Eventos, clique em Iniciar e, em seguida, clique em Executar. Na caixa de diálogo Executar, digite
eventvwr
.Na caixa de diálogo Visualizador de Eventos, expanda o nó Logs de Aplicativos e Serviços .
Expanda os nós Microsoft, Windows e Application Server-Applications.
Clique com o botão direito do mouse no nó Depurar no nó Servidor de Aplicativos-Aplicativos e selecione Habilitar Log.
Execute seu aplicativo habilitado para rastreamento para gerar eventos de rastreamento.
Clique com o botão direito do mouse no nó Depurar e selecione Atualizar. Os eventos de rastreamento devem estar visíveis no painel central.
O WF 4 fornece um participante de rastreamento que grava registros de rastreamento em uma sessão ETW (Event Tracing for Windows). O participante de rastreamento ETW é configurado com um perfil de rastreamento para se inscrever em registros de rastreamento. Quando o rastreamento está habilitado, os registros de rastreamento de erros são emitidos para o ETW. Os eventos de rastreamento ETW (entre o intervalo de 100-113) correspondentes aos eventos de rastreamento emitidos pelo participante de rastreamento ETW são gravados no Log Analítico.
Para exibir registros de rastreamento, siga estas etapas.
Para abrir o Visualizador de Eventos, clique em Iniciar e, em seguida, clique em Executar. Na caixa de diálogo Executar, digite
eventvwr
.Na caixa de diálogo Visualizador de Eventos, expanda o nó Logs de Aplicativos e Serviços .
Expanda os nós Microsoft, Windows e Application Server-Applications.
Clique com o botão direito do mouse no nó Analítico sob o nó Application Server-Applications e selecione Ativar Log.
Execute seu aplicativo habilitado para rastreamento para gerar registros de rastreamento.
Clique com o botão direito do mouse no nó analítico e selecione Atualizar. Os registros de rastreamento devem estar visíveis no painel central.
A imagem a seguir mostra o acompanhamento de eventos no visualizador de eventos:
Registrando um ID de provedor específico do aplicativo
Se os eventos precisarem ser gravados em um log de aplicativo específico, siga estas etapas para registrar o manifesto do novo provedor.
Declare o ID do provedor no arquivo de configuração do aplicativo.
<system.serviceModel> <diagnostics etwProviderId="2720e974-9fe9-477a-bb60-81fe3bf91eec"/> </system.serviceModel>
Copie o arquivo de manifesto de %windir%\Microsoft.NET\Framework\<versão mais recente do .NET Framework 4.6.1>\Microsoft.Windows.ApplicationServer.Applications.man para um local temporário e renomeie-o para Microsoft.Windows.ApplicationServer.Applications_Provider1.man
Altere o GUID no arquivo de manifesto para o novo GUID.
<provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" />
Altere o nome do provedor se você não quiser desinstalar o provedor padrão.
<provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" />
Se você alterou o nome do provedor na etapa anterior, altere os nomes de canal no arquivo de manifesto para o novo nome do provedor.
<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)" />
Gere a DLL do recurso seguindo estas etapas.
Instale o SDK do Windows. O SDK do Windows inclui o compilador de mensagens (mc.exe) e o compilador de recursos (rc.exe).
Em um prompt de comando do SDK do Windows, execute mc.exe no novo arquivo de manifesto.
mc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.man
Execute rc.exe no arquivo de recurso gerado na etapa anterior.
rc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.rc
Crie um arquivo cs vazio chamado NewProviderReg.cs.
Crie uma DLL de recurso usando o compilador C#.
csc /target:library /win32res:Microsoft.Windows.ApplicationServer.Applications_Provider1.res NewProviderReg.cs /out:Microsoft.Windows.ApplicationServer.Applications_Provider1.dll
Altere o nome da dll do recurso e da mensagem no arquivo de manifesto de para o novo nome da
Microsoft.Windows.ApplicationServer.Applications.Provider1.man
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 o manifesto.
wevtutil im Microsoft.Windows.ApplicationServer.Applications_Provider1.man