2009-03-30 5 views
1

ASP.net 페이지에서 WCF 서비스를 사용하는 데 좋은 패턴을 조언 할 수있는 사람이 있습니까? 클라이언트 (: ServiceModel.ClientBase)의 수명이 적절하게 제어되지 않아서 PipeException이 발생하는 것으로 보입니다. 현재 Page 클래스의 필드로 존재하지만 정리되지 않고 각 페이지 요청시 다시 인스턴스화됩니다 (.Close 메소드).ASP.net의 WCF 클라이언트 페이지

이 질문은 "ASP.net 페이지의 제한된 리소스 관리"라고 바꿔서 ASP.net 페이지의 수명주기와 더 관련이 있다고 생각됩니다. ASP.net을 처음 접했으므로이 점에 대한 나의 이해는 다소 희박합니다.

TIA.

편집 : 일부 코드 (! 그것을 많지 않다)

public partial class Default : Page 
{ 
    //The WCF client... obviously, instantiating it here is bad, 
    //but where to instantiate, and where to close? 
    private readonly SearchClient client = new SearchClient(); 


    protected void Page_Load(object sender, EventArgs e) 
    { 

2 편집 : 다음은 더 나은 것인가?

public partial class Default : Page 
{ 
    private SearchClient client; 


    protected void Page_Unload(object sender, EventArgs e) 
    { 
     try 
     { 
      client.Close(); 
     } 
     catch 
     { 
      //gobbled 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     client= new SearchClient(); 
     //..... 
+0

당신은 코드 샘플을 제공 할 수 있습니까? – bendewey

답변

1

나는 Michael에 동의합니다. 가능한 경우 다른 레이어로 추상화하십시오.

그러나 aspx 페이지에서 호출하려는 경우,이를 호출하기 위해 별도의 메소드를 작성하고 해당 메소드를 리턴하십시오. TS 및 정리. 코드를 한 곳에서 정리하여 코드를 깨끗하게 유지합니다. finally 블록에서 처리하는 것을 잊지 마십시오. wcf 프록시는 처리하기 위해 IDisposable로 캐스팅되어야합니다. 예를 들어

:

void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     RemoteCall(); 
    } 
} 

void RemoteCall() 
{ 
var client = new SearchClient(); 
try 
{ 
    var results = client.Search(params); 
    clients.Close(); 
} 
catch(CommunicationException cex) 
{ 
    //handle 
} 
catch(Exception ex) 
{ 
    //handle 
} 
finally 
{ 
    ((IDisposable)client).Dispose(); 
} 

} 
0

일반적으로 프리젠 테이션 계층에서 외부 서비스를 직접 호출하면 안됩니다. 첫째, 성능 (풀링, 스케일링 등)과 두 번째로 인증해야 할 경우 보안 위험이 있습니다. (DMZ의 인증 코드가 좋지 않습니다.)

응용 프로그램 계층에서 프레젠테이션 계층의 개인 서비스에 대한 서비스 호출 리팩토링을 고려해야합니다. 이렇게하면 페이지의 수명주기 (명시한대로 문제가 있음)에서 서비스의 수명주기를 분리 할 수 ​​있습니다.

+0

인증에 어떤 문제가 있습니까? WCF는 페이지가 아닌 인증을 수행합니다. –

+0

문제는 인증 소스 (LDAP/AD/데이터베이스 등)를 인터넷에 너무 가까이 배치한다는 것입니다. 그것은 더 쉽게 해킹 할 수 있습니다. –