publicar wcf configuration iis-7.5 application-pool autostart

publicar - Las características de AutoStart/Pre-warm no funcionan en el servicio IIS 7.5/WCF



publicar wcf en iis (4)

Este es un enfoque ligeramente diferente para su problema:

  1. Use Windows Server AppFabric para el inicio automático del servicio
  2. Usa la infraestructura de WCF para ejecutar código de inicio personalizado

Re 1: la función de inicio automático de Appfabric debería funcionar fuera de la caja (siempre que no esté utilizando el ServiceRoute de MVC para registrar sus servicios, DEBEN especificarse en la sección *.svc Web.config o usando archivos físicos *.svc .

Re 2: para inyectar un código de inicio personalizado en la tubería de WCF, podría usar un atributo como este:

using System; using System.ServiceModel; using System.ServiceModel.Description; namespace WCF.Extensions { /// <summary> /// Allows to specify a static activation method to be called one the ServiceHost for this service has been opened. /// </summary> [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)] public class ServiceActivatorAttribute : Attribute, IServiceBehavior { /// <summary> /// Initializes a new instance of the ServiceActivatorAttribute class. /// </summary> public ServiceActivatorAttribute(Type activatorType, string methodToCall) { if (activatorType == null) throw new ArgumentNullException("activatorType"); if (String.IsNullOrEmpty(methodToCall)) throw new ArgumentNullException("methodToCall"); ActivatorType = activatorType; MethodToCall = methodToCall; } /// <summary> /// The class containing the activation method. /// </summary> public Type ActivatorType { get; private set; } /// <summary> /// The name of the activation method. Must be ''public static void'' and with no parameters. /// </summary> public string MethodToCall { get; private set; } private System.Reflection.MethodInfo activationMethod; #region IServiceBehavior void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { serviceHostBase.Opened += (sender, e) => { this.activationMethod.Invoke(null, null); }; } void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { // Validation: can get method var method = ActivatorType.GetMethod(name: MethodToCall, bindingAttr: System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public, callConvention: System.Reflection.CallingConventions.Standard, types: Type.EmptyTypes, binder: null, modifiers: null); if (method == null) throw new ServiceActivationException("The specified activation method does not exist or does not have a valid signature (must be public static)."); this.activationMethod = method; } #endregion } }

..que puede ser usado de esta manera:

public static class ServiceActivation { public static void OnServiceActivated() { // Your startup code here } } [ServiceActivator(typeof(ServiceActivation), "OnServiceActivated")] public class YourService : IYourServiceContract { }

Ese es el enfoque exacto que hemos estado usando durante bastante tiempo y en una gran cantidad de servicios. El beneficio adicional de usar un ServiceBehavior Pack ServiceBehavior WCF para el código de inicio personalizado (en lugar de depender de la infraestructura de IIS) es que funciona en cualquier entorno de alojamiento (incluido el alojamiento propio) y se puede probar más fácilmente.

Para probar los muchos dolores de cabeza de la implementación de IIS / WCF desde cero, construí el servicio HelloWorld y el cliente lo recorrió (muy bien) here . Agregué puntos finales para net.tcp, y el servicio está funcionando correctamente de extremo a extremo para ambos enlaces bajo IIS 7.5 (en Windows 7) en su propio ApplicationPool llamado HW.

Lo que estoy tratando de empezar a trabajar son las características anunciadas de AutoStart y Preload (o "precalentamiento en caché"). He seguido las instrucciones establecidas here y here (bastante similares entre sí, pero siempre es bueno tener una segunda opinión) muy de cerca. Lo que significa que

1) Establecer el modo de startMode grupo de aplicaciones ...

<applicationPools> <!-- ... --> <add name="HW" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> </applicationPools>

2) ... habilitó serviceAutoStart y establezca un puntero a mi serviceAutoStartProvider

<site name="HW" id="2"> <application path="/" applicationPool="HW" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" /> <!-- ... --> </site>

3) ... y nombró a dicho proveedor, con el GetType().AssemblyQualifiedName de la clase enumerada en su totalidad a continuación

<serviceAutoStartProviders> <add name="PreWarmMyCache" type="MyWCFServices.Preloader, HelloWorldServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </serviceAutoStartProviders>

using System; namespace MyWCFServices { public class Preloader : System.Web.Hosting.IProcessHostPreloadClient { public void Preload(string[] parameters) { System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:/temp/PreloadTest.txt"); sw.WriteLine("Preload executed {0:G}", DateTime.Now); sw.Close(); } } }

Por desgracia, toda esta configuración manual, más un par de llamadas iisreset , y no consigo nada. No se w3wp.exe proceso w3wp.exe en el Administrador de tareas (aunque lo obtengo si ejecuto el HelloWorldClient), no hay archivos de texto y, sobre todo, no hay satisfacción.

Hay una cantidad de discusiones frustrantemente escasa sobre esta característica, ya sea en SO o en una red más amplia, y las pocas preguntas similares aquí recibieron poca atención, todo lo cual hace sonar una campana de alarma o dos. Sin embargo, tal vez sea innecesario. ¿Algún experto por ahí que haya estado en este mismo camino una o dos veces para participar? (Me complace ofrecer la solución completa si puede sugerir un buen lugar para hospedarla).

EDITAR : Intenté restablecer esa ruta en el método de Preload a la carpeta App_Data relativa (otra respuesta SO sugirió que), no importó. Además, aprendí que los procesos w3wp.exe se w3wp.exe en una simple navegación al localhost. El proceso consume una impresionante memoria de 17MB para cumplir con su pequeño OperationContract, mientras que por el precio no ofrece valor de precarga. 17MB de ColdDeadCache.


He hecho lo mismo. funciona...

En el método de precarga, ¡tengo un código copiado de un bonito documento disponible here !

El método de precarga parece ...

public void Preload(string[] parameters) { bool isServceActivated = false; int attempts = 0; while (!isServceActivated && (attempts <10)) { Thread.Sleep(1 * 1000); try { string virtualPath = "/Test1/Service1.svc"; ServiceHostingEnvironment.EnsureServiceAvailable(virtualPath); isServceActivated = true; } catch (Exception exception) { attempts++; //continue on these exceptions, otherwise fail fast if (exception is EndpointNotFoundException || exception is ServiceActivationException || exception is ArgumentException) { //log } else { throw; } } } }


Sé que esto suena absurdo pero enfrenté el mismo problema (w3wp.exe no se disparó automáticamente después de hacer los cambios de configuración) y fue porque no había ejecutado el editor de texto en modo Administrador cuando estaba editando el archivo applicationHost.config. Error estúpido de mi parte.

En mi defensa, estaba usando Notepad ++ que me dijo que estaba ahorrando cuando en realidad no lo estaba.


Tal vez usted está en un sistema de 64 bits? Hay una "feature" conocida en Windows donde el guardado se redirige a la carpeta de 32 bits y, por lo tanto, no se recogerán cambios

(He convertido mi comment en una respuesta porque las respuestas pueden ser más fáciles de encontrar)