클라이언트 쪽에서 WCF로 두 개의 메서드를 호출하고 하나의 웹 메서드를 재귀 적으로 (또는 반복적으로) 중첩 된 방식으로 다른 웹 메서드를 호출한다고 가정 해 보겠습니다. 아래의 간단한 코드는 작동하지만 적절한 예외 처리 기능을 갖추고 있다고 생각하지 않습니다. 클라이언트와 서버가 서버가 실패한 상황을 처리하기위한 최상의 디자인 템플릿은 무엇입니까?중첩 된 비동기 메서드 (특히 Silverlight)에 필요한 WCF 디자인 템플릿
나는 아래의 참고 문헌 1 ~ 3을 읽었으며 클라이언트 나 서버쪽에 물건을 버려야한다는 것을 암시하는 듯하다. 맞습니까?
Visual Studio 2008에서 C#을 코드 숨김 언어로 사용하여 Silverlight 3.5에서 WCF를 사용하고 있지만이 문제는 보편적 인 질문이므로별로 중요하지 않다고 생각합니다.
// 의사 :
//이 FirstWebService이 개체의 컬렉션을 반환 가정, MyObjects는 //이 SecondWebservice는이 컬렉션을 받아서 그것으로 무언가를 가정 목록에서, 말한다.
ServiceReference1.Service1Client aClient; 비공개 목록 myObjectList = new List();
공개 Page1() { InitializeComponent();
aClient = new myWebService.ServiceReference1.Service1Client();
aClient.FirstWebService + = 새 EventHandler (aClient_FirstWebServiceCompleted);
aClient.SecondWebServiceCompleted + = 새 EventHandler (aClient_SecondWebServiceCompleted);
}
버튼을 클릭하면 // 지금, 당신은 foreach 루프가 소진 될 때까지, 두 번째 웹 서비스 (여러 번)를 호출 할 첫 번째 웹 서비스를 호출합니다.
개인 무효 Button1_Click (개체 발신자, RoutedEventArgs) { aClient.FirstWebServiceAsync(); //은 (차례 반복 실제로 "반복적으로"두 번째 웹 서비스를 호출 (또는 것), 아래 참조) 첫 번째 웹 서비스}
를 호출
무효 aClient_FirstWebServiceCompleted (개체를 보낸 사람, myWebService.ServiceReference1.FirstWebServiceCompletedEventArgs 전자)
의 foreach (myObjectList에서 myObject에 O) {// 여기 {
if (e.Error == null)
{
myObjectList = e.Result; //assume both server side myObject and client side myObject are the same thing, so no type checking compiler error here with the Lists.
는 '순환'(루프) 일부aClient.SecondWebServiceAsync (O); // 여기에서 첫 번째 웹 서비스에서 두 번째 웹 서비스로의 재귀, 중첩 비동기 호출을 확인합니다 ... foreach 루프가 모두 소모 될 때까지 여러 번 수행됩니다.}}
else
{
//handle errors here
}
}
공극 aClient_SecondWebServiceCompleted (객체 송신자 myWebService.ServiceReference1.SecondWebServiceCompletedEventArgs E) {
if (e.Error == null)
{
// do stuff here = e.Result; //etc
} 다른 {// 에러 트랩 여기 since e.Error! = null } }
/* // 나는 위의 것을 시도해 보았지만 효과가 있으며 아직 실패하지 않았습니다. 각각의 웹 서비스는 비동기 적으로 "자신의 일을 수행"합니다. 지금까지는 괜찮 았지만, 웹 메소드는 복잡하지 않았고 아마도 그것이 작동하는 이유 일 수 있습니다. 하지만 웹 서비스가 실패 할 경우를 대비하여 적절한 비계를 마련했다고 생각하지 않습니다. 정전으로 인해 이탈 한 것으로 보입니까? 나는 실수를 느낄 것 같은 기분이 들린다. 더 강력하게 만드는 방법?
또한 첫 번째 및 두 번째 웹 서비스는 LINQ to SQL 메서드이며 TransactionScope와 함께 'using'블록으로 래핑되어 서버 측에서 실패 할 경우를 대비하여 메서드를 롤백 할 수 있도록합니다.
*/
참조 1-3 :
http://old.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx
(멍청한 놈으로 나는 스택 오버플로하여 둘 이상의 링크를 게시 할 수 있지 않다, 그래서 난 그냥 두 번째 링크를 게시합니다)또한 www.bluebytesoftware.com /blog/2008/02/18/IDisposableFinalizationAndConcurrency.aspx 내가 가비지 수집기가 마법을시키는 발견 실제적인 문제로서