Cómo: Hospedar un servicio de flujo de trabajo en IIS

Los servicios de flujo de trabajo pueden hospedarse en Internet Information Services (IIS) de la misma manera que los servicios de Windows Communication Foundation (WCF) se hospedan en IIS, mediante el uso de archivos de configuración web y de servicio, y algún código de aplicación. El hospedaje en IIS permite a un servicio de flujo de trabajo aprovechar las características de IIS como el reciclaje automático de procesos, supervisión del estado de los procesos, etc.

Hay tres maneras de hospedar un servicio de flujo de trabajo en IIS. La primera es hacer referencia a una definición de flujo de trabajo precompilada en un archivo .svc. La segunda es utilizar un archivo de marcado de flujo de trabajo con una extensión .xoml. La tercera es hacer referencia a un archivo de marcado de flujo de trabajo en un archivo .svc.

El segundo método proporciona funcionalidad de reciclaje automático en una actualización del archivo .xoml o .rules. El último método se proporciona para escenarios de extensibilidad, como la implementación de un WorkflowServiceHost personalizado para hospedar marcado de flujo de trabajo.

Nota

Cuando se implementa un servicio de flujo de trabajo como código en archivos de código fuente independientes en el directorio App_Code o se implementa el servicio mediante el modelo de ASP.NET de código en línea, debe hacer referencia a los ensamblados de flujo de trabajo en su archivo Web.config mediante el elemento de configuración <compilation>, como se muestra en el ejemplo siguiente:

<system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </assemblies>
    </compilation>
  </system.web>

Nota

El compilador de flujo de trabajo no se utiliza cuando los flujos de trabajo de código en línea se hospedan en IIS. Se utilizan sólo los compiladores específicos del lenguaje, como el compilador de C#.

Para hospedar una definición de flujo de trabajo precompilada como un servicio en IIS

  1. Confirme que IIS está instalado y ejecutándose en su equipo.

  2. Cree un nuevo directorio virtual para su servicio de flujo de trabajo y asegúrese de que ASP.NET tiene acceso a él.

  3. Cree un nuevo archivo de servicio con una extensión .svc. Modifique este archivo agregando la información de directiva ServiceHost correspondiente al servicio de flujo de trabajo. El valor Factory debe hacer referencia a la clase WorkflowServiceHostFactory. En el ejemplo siguiente se muestra un archivo de servicio con los valores adecuados.

    <%@ServiceHost language=c# Debug="true" Service="Microsoft.WorkflowServices.Samples.StateMachineCalculatorService" Factory="System.ServiceModel.Activation.WorkflowServiceHostFactory" %>
    
  4. Cree un subdirectorio Bin dentro del directorio virtual creado en el paso 2.

  5. Coloque el ensamblado que contiene su tipo de servicio de flujo de trabajo en el directorio Bin.

  6. Cree un archivo denominado Web.config en el directorio de aplicaciones. Para ejecutar el servicio, el archivo Web.config se debe encontrar en el mismo directorio que el archivo de servicio.

  7. Agregue el código de configuración correspondiente al archivo. En tiempo de ejecución, la infraestructura de WCF utiliza la información para construir un punto final con el que las aplicaciones cliente se pueden comunicar. Para el ejemplo StateMachineCalculatorService, el código de configuración es el siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <system.serviceModel>
        <services>
          <service name="Microsoft.WorkflowServices.Samples.StateMachineCalculatorService" behaviorConfiguration="ServiceBehavior" >
            <endpoint address="" 
                      binding="customBinding"
                      bindingConfiguration="basicHttpCookieBinding"
                      contract="Microsoft.WorkflowServices.Samples.ICalculator" />
            <endpoint address="ContextOverHttp" 
                      binding="wsHttpContextBinding" 
                      contract="Microsoft.WorkflowServices.Samples.ICalculator" />
          </service>
        </services>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior"  >
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <serviceCredentials>
                <windowsAuthentication
                    allowAnonymousLogons="false"
                    includeWindowsGroups="true" />
              </serviceCredentials>
              <!-- Comment out the following behavior to disable persistence store -->
              <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true">
                <services>
                  <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                       connectionString="Data Source=localhost\sqlexpress;Initial Catalog=NetFx35Samples_ServiceWorkflowStore;Integrated Security=True;Pooling=False"
                       LoadIntervalSeconds="1" UnLoadOnIdle= "true" />
                </services>
              </workflowRuntime>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <bindings>
          <customBinding>
            <binding name="basicHttpCookieBinding">
              <context contextExchangeMechanism="HttpCookie" />
              <textMessageEncoding messageVersion="Soap11" />
              <httpTransport authenticationScheme="Ntlm" />
            </binding>
          </customBinding>
        </bindings>
    
      </system.serviceModel>
    
      <system.web>
        <compilation>
          <assemblies>
            <add assembly="System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </assemblies>
        </compilation>
      </system.web>
    
    </configuration>
    

Para hospedar una definición de flujo de trabajo declarativa como un servicio en IIS

  1. Confirme que IIS está instalado y ejecutándose en su equipo.

  2. Cree un nuevo directorio virtual para su servicio de flujo de trabajo y asegúrese de que ASP.NET tiene acceso a él.

  3. Coloque el archivo de marcado de flujo de trabajo (con la extensión .xoml) y un archivo de marcado de regla opcional con el mismo nombre (con la extensión .rules) en el directorio virtual.

  4. Cree un archivo denominado Web.config en el directorio de aplicaciones. Para ejecutar el servicio, el archivo Web.config se debe encontrar en el mismo directorio que el archivo de servicio.

  5. Agregue el código de configuración correspondiente al archivo. En tiempo de ejecución, la infraestructura de WCF utiliza la información para construir un punto final con el que las aplicaciones cliente se pueden comunicar. Para el ejemplo StateMachineCalculatorService, el código de configuración es el siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <system.serviceModel>
        <services>
    <!-- Service name is workflow Name -->
          <service name="StateMachineCalculatorService" behaviorConfiguration="ServiceBehavior" >
            <endpoint address="" 
                      binding="customBinding"
                      bindingConfiguration="basicHttpCookieBinding"
                      contract="Microsoft.WorkflowServices.Samples.ICalculator" />
            <endpoint address="ContextOverHttp" 
                      binding="wsHttpContextBinding" 
                      contract="Microsoft.WorkflowServices.Samples.ICalculator" />
          </service>
        </services>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior"  >
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <serviceCredentials>
                <windowsAuthentication
                    allowAnonymousLogons="false"
                    includeWindowsGroups="true" />
              </serviceCredentials>
              <!-- Comment out the following behavior to disable persistence store -->
              <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true">
                <services>
                  <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                       connectionString="Data Source=localhost\sqlexpress;Initial Catalog=NetFx35Samples_ServiceWorkflowStore;Integrated Security=True;Pooling=False"
                       LoadIntervalSeconds="1" UnLoadOnIdle= "true" />
                </services>
              </workflowRuntime>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <bindings>
          <customBinding>
            <binding name="basicHttpCookieBinding">
              <context contextExchangeMechanism="HttpCookie" />
              <textMessageEncoding messageVersion="Soap11" />
              <httpTransport authenticationScheme="Ntlm" />
            </binding>
          </customBinding>
        </bindings>
    
      </system.serviceModel>
    
      <system.web>
        <compilation>
          <assemblies>
            <add assembly="System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </assemblies>
        </compilation>
      </system.web>
    
    </configuration>
    

Nota

El archivo de marcado de flujo de trabajo formará parte de la dirección base del servicio de flujo de trabajo. Por ejemplo, la dirección base podría ser:

http://servername:port/workflowmarkupfile.xoml/

Para hospedar una definición de flujo de trabajo declarativa como un servicio con un archivo .svc

  1. Confirme que IIS está instalado y ejecutándose en su equipo.

  2. Cree un nuevo directorio virtual para su servicio de flujo de trabajo y asegúrese de que ASP.NET tiene acceso a él.

  3. Coloque el archivo de marcado de flujo de trabajo (con la extensión .xoml) y un archivo de marcado de regla opcional con el mismo nombre (con la extensión .rules) en el directorio virtual.

  4. Coloque la directiva de servicio (con la extensión .svc) con el marcado siguiente en el mismo directorio:

    <%@ServiceHost language=c# Debug="true" Service="Calculator.xoml" Factory="System.ServiceModel.Activation.WorkflowServiceHostFactory" %>
    
  5. Cree un archivo denominado Web.config en el directorio de aplicaciones. Para ejecutar el servicio, el archivo Web.config se debe encontrar en el mismo directorio que el archivo de servicio.

  6. Agregue el código de configuración correspondiente al archivo. En tiempo de ejecución, la infraestructura de WCF utiliza la información para construir un punto final con el que las aplicaciones cliente se pueden comunicar. Para el ejemplo StateMachineCalculatorService, el código de configuración es el siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
      <system.serviceModel>
        <services>
    <!-- Service name is workflow Name -->
          <service name="StateMachineCalculatorService" behaviorConfiguration="ServiceBehavior" >
            <endpoint address="" 
                      binding="customBinding"
                      bindingConfiguration="basicHttpCookieBinding"
                      contract="Microsoft.WorkflowServices.Samples.ICalculator" />
            <endpoint address="ContextOverHttp" 
                      binding="wsHttpContextBinding" 
                      contract="Microsoft.WorkflowServices.Samples.ICalculator" />
          </service>
        </services>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="ServiceBehavior"  >
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <serviceCredentials>
                <windowsAuthentication
                    allowAnonymousLogons="false"
                    includeWindowsGroups="true" />
              </serviceCredentials>
              <!-- Comment out the following behavior to disable persistence store -->
              <workflowRuntime name="WorkflowServiceHostRuntime" validateOnCreate="true" enablePerformanceCounters="true">
                <services>
                  <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                       connectionString="Data Source=localhost\sqlexpress;Initial Catalog=NetFx35Samples_ServiceWorkflowStore;Integrated Security=True;Pooling=False"
                       LoadIntervalSeconds="1" UnLoadOnIdle= "true" />
                </services>
              </workflowRuntime>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <bindings>
          <customBinding>
            <binding name="basicHttpCookieBinding">
              <context contextExchangeMechanism="HttpCookie" />
              <textMessageEncoding messageVersion="Soap11" />
              <httpTransport authenticationScheme="Ntlm" />
            </binding>
          </customBinding>
        </bindings>
    
      </system.serviceModel>
    
      <system.web>
        <compilation>
          <assemblies>
            <add assembly="System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          </assemblies>
        </compilation>
      </system.web>
    
    </configuration>
    

Consulte también

Otros recursos

Creación de servicios de flujo de trabajo y de servicios duraderos

Footer image

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.