2016-10-06 7 views
0

jQuery ajax를 통해 [WebMethod]로 장식 된 여러 메서드를 호출하고 있습니다.ASPX 페이지 [WebMethod] 호출시 수명주기

이렇게하면 각 메소드에 대해 동일하게 외부 라이브러리에 데이터베이스 연결을 설정해야합니다. 이 작업 한

public partial class Server : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // code to set up DB connections 
     ExternalLibrary.SetupDB(); 
    } 

    [WebMethod] 
    public static string AjaxAccessibleMethod() 
    { 
     try 
     { 
      // get some data from the database via the external library 
      ExternalLibrary.CallDatabase(); 
     } 
     catch(Exception ex) 
     { 
      // handle errors 
     } 
    } 
} 

하지만 다음 ExternalLibrary의 데이터베이스가 초기화되지 않은 주장 던지는 예외를 시작 :

내 원래의 코드는이처럼 보였다.

코드에 중단 점 배치 내 AjaxAccessibleMethod를 호출 할 때 Page_Load 이벤트가 호출되지 않고 DB 설정 자료를 Page_Init 이벤트로 이동하려고 시도했지만 마찬가지로 호출되지 않았 음을 알았습니다.

WebMethods를 사용할 때 누군가가 aspx 페이지 수명주기를 설명 할 수 있습니까? 이것이 초기에 작동했다는 사실은 Page_Load가 호출되었음을 암시하는 것으로 보이지만 더 이상 존재하지 않습니다.

+1

http://stackoverflow.com/a/18072090/885626 – Ric

답변

5

WebMethod로 사용하는 메서드가 정적이라는 것을 알 수 있습니다. 이것은 페이지 개체가 전혀 작성되지 않았다는 사실에 대한 첫 번째 힌트 여야합니다.

페이지 메쏘드는 풀 블로운 웹 서비스에 대한 간단한 대안이며, 라이프 사이클은 페이지보다는 웹 서비스와 유사합니다. 즉, 요청은 HttpContext, Request 및 그와 같은 객체를 사용하여 일반적인 ASP.NET 파이프 라인을 통과합니다. 하지만 페이지 요청과 페이지 백엔드의 경우 페이지 객체가 생성되고 전체 페이지 이벤트가 발생하지만 페이지 메소드의 경우 페이지 객체가 생성되지 않고 메서드는 간단히 Server.AjaxAccessibleMethod()이라고합니다.

페이지 메서드에 대한 호출 처리를 불필요하게 복잡하게하기 때문에 두 가지를 혼합 할 방법이 없습니다. 그래서 당신을 위해 앞으로 유일한 경로가 여기에 필요한 코드를 복제 할 수 있습니다 :

protected void Page_Load(object sender, EventArgs e) 
{ 
    // code to set up DB connections 
    ExternalLibrary.SetupDB(); 
} 

[WebMethod] 
public static string AjaxAccessibleMethod() 
{ 
    ExternalLibrary.SetupDB(); 
    ... 
} 
+0

방법을 추가하는 방법에 대한 "ExternalLibrary.SetupDB();" 정적 생성자에서? 그런 식으로 코드 중복을 피할 수 있다고 생각합니다. – Boney

+0

@Boney, 정적 생성자는 사용하지 않는 것이 좋습니다. 여기서 문제는 언제 호출 될 지에 대한 통제가 전혀 없다는 것입니다. 따라서 OP가 필요하기에 너무 일찍 일어날 수 있습니다. 게다가 현재 코드는 요청 당 한 번 호출합니다. 적어도 페이지 메서드의 경우에는 정적 C'tor를 사용하여이 작업을 수행 할 것인지 확신 할 수 없습니다. – Andrei

+0

감사합니다 Andrei, 귀하의 말은 완벽한 의미입니다. 그러나 그것은 여전히 ​​내가 왜이 일을했는지에 대한 내 머리를 긁적 내버려 둔다. 그리고 내가 걱정하는 것은이 패턴을 다른 곳에서 사용했다는 것이다. - 당신이 알고있는 메커니즘이 있는가? 예를 들어 [WebMethod]가 아닌 페이지를 호출 한 다음 [WebMethod]를 호출 할 수 있습니까? – Morvael