private void retrieveResp() { #region Init result[] results = new result[10]; for (int i = 0; i < 10; i++) { results[i] = new result(); } #endregion SessionAttachInfo attachInfo = new SessionAttachInfo(Config.headNode, Convert.ToInt32(this.Range["D20", missing].Value2)); using (DurableSession session = DurableSession.AttachSession(attachInfo)) { using (BrokerClient <IService1> client = new BrokerClient <IService1>(session)) { foreach (BrokerResponse <PriceAsianOptionsResponse> response in client.GetResponses <PriceAsianOptionsResponse>()) { cellContext idx = response.GetUserData <cellContext>(); double price = response.Result.PriceAsianOptionsResult; Interlocked.Increment(ref results[idx.iteration].count); this.Range[idx.range, missing].Value2 = price; results[idx.iteration].min = Math.Min(results[idx.iteration].min, price); results[idx.iteration].max = Math.Max(results[idx.iteration].max, price); results[idx.iteration].sumPrice += price; results[idx.iteration].sumSquarePrice += price * price; results[idx.iteration].stdDev = Math.Sqrt(results[idx.iteration].sumSquarePrice - results[idx.iteration].sumPrice * results[idx.iteration].sumPrice / results[idx.iteration].count) / ((results[idx.iteration].count == 1) ? 1 : results[idx.iteration].count - 1); results[idx.iteration].stdErr = results[idx.iteration].stdDev / Math.Sqrt(results[idx.iteration].count); if (results[idx.iteration].count == 100) { int i = idx.iteration; this.Range[string.Format("{0}14", cols[i]), missing].Value2 = results[i].sumPrice / results[i].count; this.Range[string.Format("{0}15", cols[i]), missing].Value2 = results[i].min; this.Range[string.Format("{0}16", cols[i]), missing].Value2 = results[i].max; this.Range[string.Format("{0}17", cols[i]), missing].Value2 = results[i].stdDev; this.Range[string.Format("{0}18", cols[i]), missing].Value2 = results[i].stdErr; } } } session.Close(); } #region Summarize for (int i = 0; i < 10; i++) { this.Range[string.Format("{0}14", cols[i]), missing].Value2 = results[i].sumPrice / results[i].count; this.Range[string.Format("{0}15", cols[i]), missing].Value2 = results[i].min; this.Range[string.Format("{0}16", cols[i]), missing].Value2 = results[i].max; this.Range[string.Format("{0}17", cols[i]), missing].Value2 = results[i].stdDev; this.Range[string.Format("{0}18", cols[i]), missing].Value2 = results[i].stdErr; } #endregion }
private static void Worker(int sessionId) { DurableSession session = DurableSession.AttachSession(new SessionAttachInfo(headnode, sessionId)); int numRequests = 32; NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport); string guid = Guid.NewGuid().ToString(); // Create a BrokerClient proxy // This proxy is able to map One-Way, Duplex message exchange patterns // with the Request / Reply Services. As such, the client program can send the // requests, exit and re-attach to the session to retrieve responses (see the // FireNRecollect project for details using (BrokerClient <IService1> client = new BrokerClient <IService1>(guid, session, binding)) { Console.Write("Sending {0} requests...", numRequests); for (int i = 0; i < numRequests; i++) { // EchoRequest are created as you add Service Reference // EchoService to the project EchoRequest request = new EchoRequest("hello world!"); client.SendRequest <EchoRequest>(request, i); } // Flush the message. After this call, the runtime system // starts processing the request messages. If this call is not called, // the system will not process the requests. The client.GetResponses() will return // with an empty collection client.EndRequests(); client.Close(); Console.WriteLine("done"); } using (BrokerClient <IService1> client = new BrokerClient <IService1>(guid, session, binding)) { Console.WriteLine("Retrieving responses..."); // GetResponses from the runtime system // EchoResponse class is created as you add Service Reference "EchoService" // to the project foreach (var response in client.GetResponses <EchoResponse>()) { try { string reply = response.Result.EchoResult; Console.WriteLine("\tReceived response for request {0}: {1}", response.GetUserData <int>(), reply); } catch (Exception ex) { Console.WriteLine("Error occured while processing {0}-th request: {1}", response.GetUserData <int>(), ex.Message); } } Console.WriteLine("Done retrieving {0} responses", numRequests); } }
static void Main(string[] args) { try { //Input sessionId here int sessionId; Console.Write("Input the session id : "); sessionId = Int32.Parse(Console.ReadLine()); //Change the headnode name here SessionAttachInfo info = new SessionAttachInfo("head.contoso.com", sessionId); //Attach to session DurableSession session = DurableSession.AttachSession(info); Console.WriteLine("Attached to session {0}", sessionId); int numberResponse = 0; //Get responses using (BrokerClient <IPrimeFactorization> client = new BrokerClient <IPrimeFactorization>(session)) { foreach (BrokerResponse <FactorizeResponse> response in client.GetResponses <FactorizeResponse>()) { int number = response.GetUserData <int>(); int[] factors = response.Result.FactorizeResult; Console.WriteLine("{0} = {1}", number, string.Join <int>(" * ", factors)); numberResponse++; } } session.Close(true); Console.WriteLine("{0} responses have been received", numberResponse); Console.WriteLine("Press any key to exit"); Console.ReadKey(); } catch (System.Exception ex) { Console.WriteLine(ex.Message); } }
public void BvtDurableCase2() { Info("Start BVT"); SessionStartInfo sessionStartInfo; sessionStartInfo = BuildSessionStartInfo(Server, EchoSvcName, null, null, null, null, SessionUnitType.Node, null, null, null); sessionStartInfo.Secure = false; Info("Begin to create session"); string serviceJobId; int clientNum = 2; AutoResetEvent anotherClient = new AutoResetEvent(false); Task[] tasks = new Task[clientNum]; DurableSession session = DurableSession.CreateSession(sessionStartInfo); serviceJobId = session.Id; SessionAttachInfo sessionAttachInfo = new SessionAttachInfo(Server, serviceJobId); for (int i = 0; i < clientNum; i++) { var idx = i; tasks[i] = Task.Run( () => { string guid = Guid.NewGuid().ToString(); using (DurableSession attachSession = DurableSession.AttachSession(sessionAttachInfo)) { try { Info("Client {0}: Begin to send requests.", guid); using (BrokerClient <IEchoSvc> client = new BrokerClient <IEchoSvc>(guid, attachSession)) { for (int j = 0; j < NumberOfCalls; j++) { client.SendRequest <EchoRequest>(new EchoRequest(j.ToString()), j + ":" + guid); } Info("Client {0}: Begin to call EndOfMessage.", guid); client.EndRequests(); Info("Client {0}: Begin to get responses.", guid); int count = 0; if (idx == 0) { foreach (BrokerResponse <EchoResponse> response in client.GetResponses <EchoResponse>()) { count++; Info(response.Result.EchoResult); string[] rtn = response.Result.EchoResult.Split(new[] { ':' }); Assert( rtn[rtn.Length - 1] == response.GetUserData <string>().Split(new[] { ':' })[0] && response.GetUserData <string>().Split(new[] { ':' })[1] == guid, "Result is corrupt: expected:computername:{0}, actual:{1}", response.GetUserData <string>().Split(new[] { ':' })[0], response.Result.EchoResult); } } else { foreach (var response in client.GetResponses()) { count++; EchoResponse result = (EchoResponse)response.Result; Info(result.EchoResult); string[] rtn = result.EchoResult.Split(new[] { ':' }); Assert( rtn[rtn.Length - 1] == response.GetUserData <string>().Split(new[] { ':' })[0] && response.GetUserData <string>().Split(new[] { ':' })[1] == guid, "Result is corrupt: expected:computername:{0}, actual:{1}", response.GetUserData <string>(), result.EchoResult); } } if (count == NumberOfCalls) { Info("Client {0}: Total {1} calls returned.", guid, count); } else { Error("Client {0}: Total {1} calls returned, but losing {2} results.", guid, count, NumberOfCalls - count); } } } catch (Exception e) { Error("Unexpected exception of Client {0}", e.ToString()); throw; } finally { if (Interlocked.Decrement(ref clientNum) <= 0) { anotherClient.Set(); } } } }); } anotherClient.WaitOne(); Task.WaitAll(tasks); session.Close(true); session.Dispose(); }
public void BvtDurableCase1() { Info("Start BVT"); SessionStartInfo sessionStartInfo; sessionStartInfo = BuildSessionStartInfo(Server, EchoSvcName, null, null, null, null, SessionUnitType.Node, null, null, null); sessionStartInfo.Secure = false; string serviceJobId; Info("Begin to create Durable Session."); string guid = Guid.NewGuid().ToString(); using (DurableSession session = DurableSession.CreateSession(sessionStartInfo)) { serviceJobId = session.Id; var epr = new EndpointAddress(string.Format(NetTcpEndpointPattern, Server, serviceJobId)); Info("EPR: {0}", epr); try { Info("Client {0}: Begin to send requests.", guid); using (BrokerClient <IEchoSvc> client = new BrokerClient <IEchoSvc>(guid, session)) { for (int i = 0; i < NumberOfCalls; i++) { client.SendRequest <EchoRequest>(new EchoRequest(i.ToString()), i + ":" + guid); } Info("Client {0}: Begin to call EndOfMessage.", guid); client.EndRequests(); } } catch (Exception e) { Error("Unexpected exception of Client {0}", e.ToString()); throw; } } // sleep 10 seconds Info("Client disconnects and sleep 10 seconds"); Thread.Sleep(10000); SessionAttachInfo sessionAttachInfo = new SessionAttachInfo(Server, serviceJobId); int count = 0; Info("Begin to attach Durable Session."); try { using (DurableSession session = DurableSession.AttachSession(sessionAttachInfo)) { Info("Begin to retrieve results."); using (BrokerClient <IEchoSvc> client = new BrokerClient <IEchoSvc>(guid, session)) { foreach (BrokerResponse <EchoResponse> response in client.GetResponses <EchoResponse>()) { Info(response.Result.EchoResult); string[] rtn = response.Result.EchoResult.Split(new[] { ':' }); Assert( rtn[rtn.Length - 1] == response.GetUserData <string>().Split(new[] { ':' })[0] && response.GetUserData <string>().Split(new[] { ':' })[1] == guid, "Result is corrupt: expected:computername:{0}, actual:{1}", response.GetUserData <string>().Split(new[] { ':' })[0], response.Result.EchoResult); count++; } } session.Close(); } if (NumberOfCalls == count) { Info("Total {0} calls returned.", count); } else { Error("Total {0} calls returned, but losing {1} results.\n", count, NumberOfCalls - count); } } catch (Exception e) { Error("Unexpected exception during attaching and getting response {0}", e.ToString()); throw; } }
static int Main(string[] args) { ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback((a, b, c, d) => { return(true); }); ParseArgument(args); if (showhelp) { Console.WriteLine("Usage:"); Console.WriteLine("Interactive Session's Usage: TestClient.exe [-h headnode] [-m max_cores] [-min min_cores] [-n req_count] [-r millisec_for_each_req] [-i bytes_for_each_req] [-c common_data_for_each_req] [-o bytes_for_each_response] [-sleep sleeptime_before_sending] [-cp common_data_path] [-client clientCounts] [-save filename] [-rest]"); Console.WriteLine("Interactive Session's Usage with BrokerClient: TestClient.exe [-h headnode] [-m max_cores] [-min min_cores] [-n req_count] [-r millisec_for_each_req] [-i bytes_for_each_req] [-c common_data_for_each_req] [-o bytes_for_each_response] [-sleep sleeptime_before_sending] [-cp common_data_path] [-client clientCounts] [-save filename] [-rest] -interactiveNew"); Console.WriteLine("Durable Session's Usage: TestClient.exe [-h headnode] [-m max_cores] [-min min_cores] [-n req_count] [-r millisec_for_each_req] [-i bytes_for_each_req] [-c common_data_for_each_req] [-o bytes_for_each_response] [-sleep sleeptime_before_sending] [-cp common_data_path] [-client clientCounts] [-save filename] [-rest] -durable"); Console.WriteLine("The return code of the executable is the session Id which the program creates/attaches"); return(-1); } SessionStartInfo startInfo = new SessionStartInfo(headnode, ServiceName); startInfo.UseInprocessBroker = inproc; startInfo.IsNoSession = standalone; startInfo.RegPath = regPath; startInfo.Secure = false; startInfo.IpAddress = commaSeparatedTargetList.Split(','); if (http) { startInfo.TransportScheme = TransportScheme.Http; } startInfo.SessionResourceUnitType = SessionUnitType.Core; startInfo.MaximumUnits = max_cores; startInfo.MinimumUnits = min_cores; startInfo.BrokerSettings.SessionIdleTimeout = 60 * 60 * 1000; startInfo.BrokerSettings.MaxMessageSize = int.MaxValue; if (rest) { startInfo.TransportScheme = TransportScheme.WebAPI; } if (sleep_before_sending > 60 * 1000) { startInfo.BrokerSettings.SessionIdleTimeout = sleep_before_sending * 2; } if (!String.IsNullOrEmpty(username)) { startInfo.Username = username; } if (!String.IsNullOrEmpty(password)) { startInfo.Password = password; } if (retryRequestAndIgnoreRetryOperationError) { startInfo.Environments.Add("RetryRequest", bool.TrueString); } if (userTraceCount > 0) { startInfo.Environments.Add("UserTraceCount", userTraceCount.ToString()); } //if create session only, create session first and then return exit code as session id if (createSessionOnly) { CreateSession(startInfo, durable); } data.StartInfo = startInfo; data.Count = req_count; data.Milliseconds = millisec_for_each_req; data.InputDataSize = input_data_size; data.CommonDataSize = common_data_size; data.OutputDataSize = output_data_size; data.Client = batchCount; data.IsDurable = durable; data.OnDemand = onDemand; foreach (string arg in args) { data.Command += (" " + arg); } Log("****** Test begin: {0} ******", data.Command); data.SessionStart = DateTime.Now; Log("Begin to create session."); SessionBase session; if (durable) { if (sessionId == "-1") { session = DurableSession.CreateSession(startInfo); } else { session = DurableSession.AttachSession(new SessionAttachInfo(headnode, sessionId)); } } else { if (sessionId == "-1") { session = Session.CreateSession(startInfo); } else { session = Session.AttachSession(new SessionAttachInfo(headnode, sessionId)); } } Log("Session created: {0}.", session.Id); data.SessionCreated = DateTime.Now; data.SessionId = session.Id; data.StartSendRequest = DateTime.Now; RunTest(session, !v2Client); Log("Begin to close session."); data.CloseSessionStart = DateTime.Now; // if sessionId is set by user, it's mostly used by multi-client-one-session, so do not close it if (sessionId == "-1") { try { session.Close(true, 10 * 60 * 1000); } catch (Exception e) { Log("Close session failed: {0}", e.ToString()); } finally { Log("Session closed."); } } data.SessionEnd = DateTime.Now; data.ProcessData(); foreach (string str in Utils.GetOuputString(data)) { Console.WriteLine(str); } if (string.IsNullOrEmpty(filename)) { filename = "result" + DateTime.Now.ToString("yyyyMdHms"); } if (detail) { Utils.SaveDetail(data, filename); } if (!no_log) { Utils.LogOutput(data, filename); } if (!no_chart) { Utils.DrawChart(data, filename); } //return data.SessionId; return(0); }
static void Main(string[] args) { const string headnode = "[headnode]"; const string serviceName = "EchoService"; if (args.Length == 1) { // attach to the session int sessionId = Int32.Parse(args[0]); SessionAttachInfo info = new SessionAttachInfo(headnode, sessionId); Console.Write("Attaching to session {0}...", sessionId); // Create attach to a session using (DurableSession session = DurableSession.AttachSession(info)) { Console.WriteLine("done."); // Create a client proxy using (BrokerClient <IService1> client = new BrokerClient <IService1>(session)) { Console.WriteLine("Retrieving results..."); // Get all the results foreach (BrokerResponse <EchoResponse> response in client.GetResponses <EchoResponse>()) { string reply = response.Result.EchoResult; Console.WriteLine("\tReceived response for request {0}: {1}", response.GetUserData <int>(), reply); } Console.WriteLine("Done retrieving results."); } // Close the session to reclaim the system storage // used to store the results. After the session is closed // you cannot attatch to the same session again session.Close(); } } else { // Create a durable session, fire the requests and exit SessionStartInfo info = new SessionStartInfo(headnode, serviceName); Console.Write("Creating a session..."); using (DurableSession session = DurableSession.CreateSession(info)) { Console.WriteLine("done session id = {0}.", session.Id); NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport); using (BrokerClient <IService1> client = new BrokerClient <IService1>(session, binding)) { Console.Write("Sending requests..."); for (int i = 0; i < 12; i++) { EchoRequest request = new EchoRequest("hello world!"); client.SendRequest <EchoRequest>(request, i); } client.EndRequests(); Console.WriteLine("done"); } Console.WriteLine("Type \"FileNRecollect.exe {0}\" to collect the results", session.Id); } } }
static void Main(string[] args) { //change the headnode name here const string headnode = "[headnode]"; const string serviceName = "EchoService"; const int numRequests = 12; SessionStartInfo startInfo = new SessionStartInfo(headnode, serviceName); startInfo.BrokerSettings.SessionIdleTimeout = 15 * 60 * 1000; startInfo.BrokerSettings.ClientIdleTimeout = 15 * 60 * 1000; Console.Write("Creating a session for EchoService..."); // Create a durable session int sessionId = 0; DurableSession session = null; bool successFlag = false; int retryCount = 0; const int retryCountMax = 20; const int retryIntervalMs = 5000; while (!successFlag && retryCount++ < retryCountMax) { try { session = DurableSession.CreateSession(startInfo); successFlag = true; } catch (EndpointNotFoundException e) { Console.WriteLine("EndpointNotFoundException {0}", e.ToString()); } catch (CommunicationException e) { Console.WriteLine("CommunicationException {0}", e.ToString()); } catch (TimeoutException e) { Console.WriteLine("TimeoutException {0}", e.ToString()); } catch (SessionException e) { Console.WriteLine("SessionException {0}, error code 0x{1:x}", e.ToString(), e.ErrorCode); // if session fatal errors happen, no retry if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.SessionFatalError)) { Console.WriteLine("SessionExceptionCategory : SessionFatalError {0}", e.ToString()); Console.WriteLine("No retry."); retryCount = retryCountMax; continue; } } catch (Exception e) { Console.WriteLine("General exception {0}", e.ToString()); } if (!successFlag) { Console.WriteLine("=== Sleep {0} ms to retry. Retry count left {1}. ===", retryIntervalMs, retryCountMax - retryCount); Thread.Sleep(retryIntervalMs); } } if (!successFlag) { Console.WriteLine("Create durable session failed."); return; } sessionId = session.Id; Console.WriteLine("Done session id = {0}", sessionId); //send requests successFlag = false; retryCount = 0; const int sendTimeoutMs = 5000; const int clientPurgeTimeoutMs = 60000; while (!successFlag && retryCount++ < retryCountMax) { using (BrokerClient <IService1> client = new BrokerClient <IService1>(session)) { Console.Write("Sending {0} requests...", numRequests); try { for (int i = 0; i < numRequests; i++) { //client.SendRequest<EchoFaultRequest>(new EchoFaultRequest("dividebyzeroexception"), i, sendTimeoutMs); client.SendRequest <EchoDelayRequest>(new EchoDelayRequest(5000), i, sendTimeoutMs); } client.EndRequests(); successFlag = true; Console.WriteLine("done"); } catch (TimeoutException e) { // Timeout exceptions Console.WriteLine("TimeoutException {0}", e.ToString()); } catch (CommunicationException e) { //CommunicationException Console.WriteLine("CommunicationException {0}", e.ToString()); } catch (SessionException e) { Console.WriteLine("SessionException {0}, error code 0x{1:x}", e.ToString(), e.ErrorCode); if (SOAFaultCode.Broker_BrokerUnavailable == e.ErrorCode) { Console.WriteLine("SessionException : BrokerUnavailable {0}", e.ToString()); } // Session Exceptions are unrecoverable unless they are application errors if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.ApplicationError)) { Console.WriteLine("SessionExceptionCategory : ApplicationError {0}", e.ToString()); } // if session fatal errors happen, no retry if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.SessionFatalError)) { Console.WriteLine("SessionExceptionCategory : SessionFatalError {0}", e.ToString()); Console.WriteLine("No retry."); retryCount = retryCountMax; continue; } } catch (Exception e) { //general exceptions Console.WriteLine("Exception {0}", e.ToString()); } //purge client if not succeeded, needed? if (!successFlag) { try { client.Close(true, clientPurgeTimeoutMs); } catch (Exception e) { Console.WriteLine("Failed to purge the client after send request failure {0}", e.ToString()); } } } if (!successFlag) { Console.WriteLine("=== Sleep {0} ms to retry. Retry count left {1}. ===", retryIntervalMs, retryCountMax - retryCount); Thread.Sleep(retryIntervalMs); } } if (!successFlag) { Console.WriteLine("Send requests failed."); return; } //dispose the session here session.Dispose(); //attach the session SessionAttachInfo attachInfo = new SessionAttachInfo(headnode, sessionId); successFlag = false; retryCount = 0; const int attachTimeoutMs = 15000; while (!successFlag && retryCount++ < retryCountMax) { try { session = DurableSession.AttachSession(attachInfo); successFlag = true; } catch (EndpointNotFoundException e) { Console.WriteLine("{0}", e.ToString()); } catch (CommunicationException e) { Console.WriteLine("{0}", e.ToString()); } catch (SessionException e) { Console.WriteLine("SessionException {0}, error code 0x{1:x}", e.ToString(), e.ErrorCode); // if session fatal errors happen, no retry if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.SessionFatalError)) { Console.WriteLine("SessionExceptionCategory : SessionFatalError {0}", e.ToString()); Console.WriteLine("No retry."); retryCount = retryCountMax; continue; } } catch (Exception e) { Console.WriteLine("General exception {0}", e.ToString()); } if (!successFlag) { Console.WriteLine("=== Sleep {0} ms to retry. Retry count left {1}. ===", retryIntervalMs, retryCountMax - retryCount); Thread.Sleep(retryIntervalMs); } } if (!successFlag) { Console.WriteLine("Attach durable session failed."); return; } successFlag = false; retryCount = 0; const int getTimeoutMs = 30000; const int clientCloseTimeoutMs = 15000; Console.WriteLine("Retrieving responses..."); while (!successFlag && retryCount++ < retryCountMax) { using (BrokerClient <IService1> client = new BrokerClient <IService1>(session)) { // GetResponses from the runtime system // EchoResponse class is created as you add Service Reference "EchoService" to the project try { //foreach (var response in client.GetResponses<EchoFaultResponse>(getTimeoutMs)) foreach (var response in client.GetResponses <EchoDelayResponse>(getTimeoutMs)) { try { //string reply = response.Result.EchoFaultResult ; int reply = response.Result.EchoDelayResult; Console.WriteLine("\tReceived response for delay request {0}: {1}", response.GetUserData <int>(), reply); } catch (FaultException <DivideByZeroException> e) { // Application exceptions Console.WriteLine("FaultException<DivideByZeroException> {0}", e.ToString()); } catch (FaultException e) { // Application exceptions Console.WriteLine("FaultException {0}", e.ToString()); } catch (RetryOperationException e) { // RetryOperationExceptions may or may not be recoverable Console.WriteLine("RetryOperationException {0}", e.ToString()); } } successFlag = true; Console.WriteLine("Done retrieving {0} responses", numRequests); } catch (TimeoutException e) { // Timeout exceptions Console.WriteLine("TimeoutException {0}", e.ToString()); } catch (CommunicationException e) { //CommunicationException Console.WriteLine("CommunicationException {0}", e.ToString()); } catch (SessionException e) { Console.WriteLine("SessionException {0}, error code 0x{1:x}", e.ToString(), e.ErrorCode); if (SOAFaultCode.Broker_BrokerUnavailable == e.ErrorCode) { Console.WriteLine("SessionException : BrokerUnavailable {0}", e.ToString()); } // Session Exceptions are unrecoverable unless they are application errors if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.ApplicationError)) { Console.WriteLine("SessionExceptionCategory : ApplicationError {0}", e.ToString()); } // if session fatal errors happen, no retry if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.SessionFatalError)) { Console.WriteLine("SessionExceptionCategory : SessionFatalError {0}", e.ToString()); Console.WriteLine("No retry."); retryCount = retryCountMax; continue; } } catch (Exception e) { //general exceptions Console.WriteLine("Exception {0}", e.ToString()); } try { client.Close(false, clientCloseTimeoutMs); } catch (Exception e) { Console.WriteLine("Exception", e.ToString()); } } if (!successFlag) { Console.WriteLine("=== Sleep {0} ms to retry. Retry count left {1}. ===", retryIntervalMs, retryCountMax - retryCount); Thread.Sleep(retryIntervalMs); } } //explict close the session to free the resource successFlag = false; retryCount = 0; Console.WriteLine("Close the session..."); while (!successFlag && retryCount++ < retryCountMax) { try { session.Close(true); successFlag = true; } catch (SessionException e) { Console.WriteLine("SessionException {0}, error code 0x{1:x}", e.ToString(), e.ErrorCode); // if session fatal errors happen, no retry if (SOAFaultCode.Category(e.ErrorCode).Equals(SOAFaultCodeCategory.SessionFatalError)) { Console.WriteLine("SessionExceptionCategory : SessionFatalError {0}", e.ToString()); Console.WriteLine("No retry."); retryCount = retryCountMax; continue; } } catch (Exception e) { Console.WriteLine("{0}", e.ToString()); } if (!successFlag) { Console.WriteLine("=== Sleep {0} ms to retry. Retry count left {1}. ===", retryIntervalMs, retryCountMax - retryCount); Thread.Sleep(retryIntervalMs); } } Console.WriteLine("Press any key to exit."); Console.ReadKey(); }