Domanda

Ho un progetto ASP.NET che prevede l'utilizzo di un ihttpmodule personalizzato. Questo modulo si siederà in cantiere e quando alcuni criteri corrispondono, dovrebbe invocare un metodo su un servizio WCF ospitato in una semplice applicazione C# console sulla stessa macchina.

Il codice per il modulo è di seguito:

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();
            }
        }        
    }
}

Il mio problema è che questo funziona la prima volta, ma poi i successivi tentativi causano questo messaggio di errore

L'oggetto di comunicazione, System.Servicemodel.channels.ServiceChannel, non può essere utilizzato per la comunicazione perché è nello stato di errore.

Sembra che sto facendo qualcosa di sbagliato, e sono nuovo a WCF in generale, quindi è molto probabile.

Penso che il problema sia circondato dalla ricreazione di canali e provoca lo stato di errore.

È stato utile?

Soluzione

L'errore specifico probabilmente indica la fabbrica di errore, ha lanciato un'eccezione (che stai deglutindo) e poi quando il blocco finalmente esegue, la chiamata di fabbrica.close () non riesce perché la fabbrica è guastata (se un oggetto WCF è efetto per chiamare abort () su di esso, non chiuso ()).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top