2011-02-01 2 views
0

사용자 지정 IHttpModule을 사용하는 ASP.net 프로젝트가 있습니다. 이 모듈은 파이프 라인에 앉아 특정 기준이 일치하면 동일한 컴퓨터의 간단한 C# 콘솔 응용 프로그램에서 호스팅되는 WCF 서비스에서 메서드를 호출해야합니다.IIS ASP.net IHttpModule의 WCF 채널 활용

모듈에 대한 코드는 다음과 같습니다 :

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

내 문제는 이것이 처음 실행하는 것입니다,하지만 후속 시도는이 오류 메시지

통신 개체, 시스템을 야기한다. ServiceModel.Channels.ServiceChannel, 은 오류 상태이므로 통신 에 사용할 수 없습니다.

나는 뭔가 잘못하고있는 것처럼 보입니다. 그리고 나는 WCF를 처음 접했을 가능성이 매우 높습니다.

저는 ChannelFactory가 다시 생성되는 것을 둘러싼 문제라고 생각합니다. 오류가 발생한 상태가됩니다.

답변

1

특정 오류는 공장에서 오류가 발생했음을 의미하고, 예외를 던지며 (마지막으로 삼키는 것입니다.) finally 블록이 실행되면 factory.Close() 호출이 실패합니다 (WCF 객체가 오류가 발생하면 Close()가 아닌 Abort()를 호출해야합니다.

+0

주요 문제를 제거하는 데 도움이됩니다. 감사합니다 tomasr. 이제 사이트 내의 각기 다른 페이지에 대해 새로운 HTTPModule 인스턴스가 만들어 질 때마다 약간의 차이가 있습니다. 이 새 인스턴스는 "각 소켓 주소 (프로토콜/네트워크 주소/포트)의 한 용도 만 정상적으로 허용됩니다"예외 (다른 인스턴스가 연결되어 있기 때문에)라는 이유로 명명 된 파이프에 연결할 수 없습니다. – justacodemonkey

+0

HttpModules는 항상 여러 인스턴스를 사용합니다. 또한 클라이언트 채널이 누출됩니다. 당신은 공장이 아니라 채널을 닫을뿐입니다 (필요에 따라 공장을 캐시해야합니다) – tomasr

+0

내 시나리오에서 공장을 캐시하는 방법에 대한 아이디어가 있습니까? – justacodemonkey