2013-04-15 2 views
1

ASP.NET의 비동기 콜백 및 웹 폼 응용 프로그램을 사용하여 WCF로 작성된 서버 응용 프로그램이 있습니다. 모든 통신이 2 응용 프로그램 사이에 문제가되지 않습니다. 웹 응용 프로그램을 통해 서버에서 노출 된 함수를 호출 할 수 있으며 서버가 웹 응용 프로그램에 콜백을 보낼 수 있습니다. 그러나 콜백 작업 내의 함수 및 기타 시간, 그들은하지 않습니다.WCF ASP.NET 상호 운용성

예를 들어 웹 앱의 로그인 버튼을 사용하여 사용자 이름과 비밀번호를 서버에 보내고 서버가 데이터베이스와 비교하여 로그인 정보가 올바른 경우 콜백을 보내야합니다. 웹 응용 프로그램에서 새 페이지를 엽니 다. 그것은 코드 뿐이다,

private InstanceContext _instanceContext; 
private ServiceClient _service; 
public CallbackHandler MyCallbackHandler = new CallbackHandler(); 


protected void Page_Load(object sender, EventArgs e) 
{ 
    _instanceContext = new InstanceContext(MyCallbackHandler); 
    _backEnd = new ServiceClient(_instanceContext, "NetTcpBinding_IAU", "net.tcp://localhost/MyService/Service"); 
    _backEnd.Open(); 
    MyCallbackHandler.LoginSucceeded += OnLoginSucceeded; 
} 


protected void LoginButton_Click(object sender, EventArgs e) 
{ 
    _backEnd.Login(UsernameTextBox.Text, PasswordTextBox.Text); 
} 

private void OnLoginSucceeded(object sender, EventArgs e) 
{ 
    ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "window.open('Client.aspx','_self');", true); 
} 

내가 중단 점에 놓고, 모든 것이 제대로 작동 볼 수 있습니다

public void Login(String username, String password) 
{ 
    //DoCheckAgainstDatabase(username, password); 

    ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>(); 
    callback.LoginSuccess(); 
} 

및 웹 응용 프로그램 코드 : 여기

은 관련 서버 코드 'ScriptManager.RegisterStartupScript ...'는 항상 제대로 실행되지 않습니다.

스레딩과 관련이 있습니까? 누구든지이 문제를 해결할 수있는 방법을 제안 할 수 있습니까?

미리 감사드립니다. 데이비드

+0

당신이 OnLoginSucceeded' 항상 호출되지 않습니다'을 의미합니까 : 새로운 페이지를 열어 진행 전으로 ManualResetEvent를 추가했습니다, 나는 콜백을받을 때까지 다음 버튼 클릭 방식에서, 나는 다음, 대기 , 그렇지 않으면'RegisterStartupScript'가 항상 원하는 효과를 갖는 것은 아니겠습니까? –

+0

OnLoginSucceeded는 항상 매번 호출되며, 원하는 효과를 항상 지니지는 않는 RegisterStartupScript입니다. –

+0

OnLoginSucceeded는 페이지가 렌더링 단계로 넘어 가서 출력을 렌더링 한 후에 발생하는 경우가 있습니다. 이 경우 시작 스크립트를 얻을 수 없습니다. PreRender 이벤트 핸들러에 중단 점 또는 Debug.WriteLine을 넣고 OnLoginSucceeded 전에 발생했는지 여부를 확인하여 테스트 할 수 있습니다. –

답변

0

처럼, 그것은 당신의 window.oppen 포장 렌더 스테이지는 콜백이 호출되기 전에 시작 스크립트가 출력에 기록되는 곳입니다.

서비스 호출을 동 기적으로 호출 할 수 있습니까? 서비스 호출이 반환 될 때까지 LoginButton_Click을 벗어나지 마십시오.

+0

나는이 문제에 대해 당신이 옳았다 고 생각합니다. 수정 된 코드를 게시했습니다. 고맙습니다! –

0

난 당신 스크립트 태그를 누락 생각 - 또는 적어도에 도착 - 페이지 수명주기가 종료 될 수 있습니다 가능성이 나에게 발생

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "<script>window.open('Client.aspx','_self');</script>", true); 
+0

안녕하세요, 문제가 해결되지 않은 것 같습니다. 아직 예상대로 작동하지 않습니다. –

0

Ann L.에게 감사드립니다.

private InstanceContext _instanceContext; 
private ServiceClient _service; 
public CallbackHandler MyCallbackHandler = new CallbackHandler(); 
private ManualResetEvent _resetEvent = new ManualResetEvent(false); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    _instanceContext = new InstanceContext(MyCallbackHandler); 
    _backEnd = new ServiceClient(_instanceContext, "NetTcpBinding_IAU", "net.tcp://localhost/MyService/Service"); 
    _backEnd.Open(); 
    MyCallbackHandler.LoginSucceeded += OnLoginSucceeded; 
} 


protected void LoginButton_Click(object sender, EventArgs e) 
{ 
    _backEnd.Login(UsernameTextBox.Text, PasswordTextBox.Text); 
    _resetEvent.WaitOne(); 

    ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "OpenClientWindow", "window.open('Client.aspx','_self');", true); 
} 

private void OnLoginSucceeded(object sender, EventArgs e) 
{ 
    _resetEvent.Set(); 
}