Использование канала WCF из IHttpModule IIS ASP.net - PullRequest
0 голосов
/ 01 февраля 2011

У меня есть проект ASP.net, который включает в себя использование собственного IHttpModule.Этот модуль будет находиться в конвейере, и, когда определенные критерии совпадают, он должен вызвать метод службы WCF, размещенной в простом консольном приложении C # на том же компьютере.

Код модуля приведен ниже:

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

Моя проблема в том, что это запускается первый раз, но затем последующие попытки вызывают это сообщение об ошибке

Объект связи, System.ServiceModel.Channels.ServiceChannel, не может использоватьсядля общения, потому что он находится в состоянии Failed.

Кажется, что я делаю что-то не так, и я новичок в WCF в целом, так что это очень вероятно.

Iдумаю, что проблема связана с воссозданием ChannelFactory, и это вызывает состояние сбоя.

1 Ответ

1 голос
/ 01 февраля 2011

Конкретная ошибка, вероятно, означает, что фабрика вышла из строя, вызвала исключение (которое вы проглатываете), а затем, когда выполняется блок finally, вызов factory.Close () завершился неудачно, потому что фабрика неисправна (если неисправен объект WCF) вам нужно вызвать Abort (), а не Close ()).

...