Pregunta

Tengo un proyecto ASP.NET que implica usar un IHTTPModule personalizado. Este módulo se ubicará en la tubería y cuando ciertos criterios coincidan, debe invocar un método en un servicio WCF alojado en una aplicación simple de consola C# en la misma máquina.

El código para el módulo está a continuación:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.SessionState;
using System.Web;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Configuration;
using System.ServiceModel;
using SimpleFarmStateServer;

namespace SimpleFarm
{
    public class SimpleFarmModuleSS : IHttpModule, IRequiresSessionState
    {
        protected string cache_directory = "";

        // WCF
        ChannelFactory<IStateServer> factory;
        IStateServer channel;

        public void Dispose() { }

        public void Init(System.Web.HttpApplication context)
        {            
            context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);

            setupFactory();
        }

        void setupFactory()
        {
            factory = new ChannelFactory<IStateServer>(
                    new NetNamedPipeBinding(),
                    "net.pipe://localhost/StateServer");
        }

        void context_PreRequestHandlerExecute(object sender, EventArgs e)
        {
            try
            {
                if (factory.State != CommunicationState.Opened)
                    setupFactory();

                channel = factory.CreateChannel();
                channel.LogAccess("Hello World!");
            }
            catch (Exception ex)
            {

            }
            finally
            {
                factory.Close();
            }
        }        
    }
}

Mi problema es que esto se ejecuta la primera vez, pero luego los intentos posteriores causan este mensaje de error

El objeto de comunicación, System.ServiceModel.channels.ServiceChannel, no se puede usar para la comunicación porque está en el estado de fallas.

Parece que estoy haciendo algo mal, y soy nuevo en WCF en general, así que esto es muy probable.

Creo que el problema está en torno al canalelfactory recreado, y esto causa el estado con fallas.

¿Fue útil?

Solución

El error específico probablemente significa que la fábrica falló, lanzó una excepción (que está tragando) y luego, cuando el bloque finalmente se ejecuta, la llamada de fábrica.close () falla porque la fábrica está fallada (si un objeto WCF está fallado, necesita para llamar a abort () sobre él, no cerrar ()).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top