55using ServiceStack ;
66using ServiceStack . OrmLite ;
77
8- namespace Test . ServiceInterface
8+ namespace Test . ServiceInterface ;
9+
10+ [ Route ( "/ping" ) ]
11+ public class Ping { }
12+
13+ public class PingResponse
914{
10- [ Route ( "/ping" ) ]
11- public class Ping { }
15+ public Dictionary < string , ResponseStatus > Responses { get ; set ; }
16+ public ResponseStatus ResponseStatus { get ; set ; }
17+ }
1218
13- public class PingResponse
19+ public class PingService : Service
20+ {
21+ private static string [ ] urls = new [ ]
1422 {
15- public Dictionary < string , ResponseStatus > Responses { get ; set ; }
16- public ResponseStatus ResponseStatus { get ; set ; }
17- }
23+ "http://techstacks.io" ,
24+ "http://techstacks.io/tasks/hourly" ,
25+ "http://autoqueryviewer.servicestack.net/services" ,
26+ "http://github.servicestack.net/repos" ,
27+ "https://servicestack.net/pricing" ,
28+ "http://react-chat.servicestack.net" ,
29+ "http://chat.servicestack.net" ,
30+ //"http://badapi.net/internalservererror",
31+ "http://stackapis.servicestack.net" ,
32+ "http://httpbenchmarks.servicestack.net" ,
33+ "http://emailcontacts.servicestack.net" ,
34+ "http://imgur.servicestack.net" ,
35+ //"http://bootstrapapi.servicestack.net",
36+ "http://todos.servicestack.net" ,
37+ "http://razor.servicestack.net" ,
38+ "http://redisadminui.servicestack.net" ,
39+ "http://redisreact.servicestack.net" ,
40+ "http://awsrazor.servicestack.net" ,
41+ "http://awsapps.servicestack.net" ,
42+ "http://awsrazor.servicestack.net/stars/dead/cobain/" ,
43+ "http://redisgeo.servicestack.net" ,
44+ //"http://restfiles.servicestack.net",
45+ //"http://redisstackoverflow.servicestack.net",
46+ //"http://northwind.servicestack.net",
47+ //"http://docs.servicestack.net",
48+ //"http://mvc.servicestack.net",
49+ //"http://webforms.servicestack.net",
50+ } ;
1851
19- public class PingService : Service
52+ public object Any ( Ping request )
2053 {
21- private static string [ ] urls = new [ ]
54+ var ret = new PingResponse
2255 {
23- "http://techstacks.io" ,
24- "http://techstacks.io/tasks/hourly" ,
25- "http://autoqueryviewer.servicestack.net/services" ,
26- "http://github.servicestack.net/repos" ,
27- "https://servicestack.net/pricing" ,
28- "http://react-chat.servicestack.net" ,
29- "http://chat.servicestack.net" ,
30- //"http://badapi.net/internalservererror",
31- "http://stackapis.servicestack.net" ,
32- "http://httpbenchmarks.servicestack.net" ,
33- "http://emailcontacts.servicestack.net" ,
34- "http://imgur.servicestack.net" ,
35- //"http://bootstrapapi.servicestack.net",
36- "http://todos.servicestack.net" ,
37- "http://razor.servicestack.net" ,
38- "http://redisadminui.servicestack.net" ,
39- "http://redisreact.servicestack.net" ,
40- "http://awsrazor.servicestack.net" ,
41- "http://awsapps.servicestack.net" ,
42- "http://awsrazor.servicestack.net/stars/dead/cobain/" ,
43- "http://redisgeo.servicestack.net" ,
44- //"http://restfiles.servicestack.net",
45- //"http://redisstackoverflow.servicestack.net",
46- //"http://northwind.servicestack.net",
47- //"http://docs.servicestack.net",
48- //"http://mvc.servicestack.net",
49- //"http://webforms.servicestack.net",
56+ Responses = new Dictionary < string , ResponseStatus > ( )
5057 } ;
5158
52- public object Any ( Ping request )
59+ foreach ( var url in urls )
5360 {
54- var ret = new PingResponse
55- {
56- Responses = new Dictionary < string , ResponseStatus > ( )
57- } ;
58-
59- foreach ( var url in urls )
61+ var name = url . Replace ( "https" , "http" ) . Replace ( "http://" , "" ) . SplitOnFirst ( '.' ) . First ( ) ;
62+ try
6063 {
61- var name = url . Replace ( "https" , "http" ) . Replace ( "http://" , "" ) . SplitOnFirst ( '.' ) . First ( ) ;
62- try
63- {
64- var sw = Stopwatch . StartNew ( ) ;
65- var response = url . GetStringFromUrl ( requestFilter : req => req . With ( c => c . UserAgent = "TestServices" ) ) ;
66- ret . Responses [ name ] = new ResponseStatus
67- {
68- Message = "OK {0}ms" . Fmt ( sw . ElapsedMilliseconds )
69- } ;
70- }
71- catch ( Exception ex )
64+ var sw = Stopwatch . StartNew ( ) ;
65+ var response = url . GetStringFromUrl ( requestFilter : req => req . With ( c => c . UserAgent = "TestServices" ) ) ;
66+ ret . Responses [ name ] = new ResponseStatus
7267 {
73- ret . Responses [ name ] = ex . ToResponseStatus ( ) ;
74- var body = ex . GetResponseBody ( ) ;
75- ret . Responses [ name ] . Message = body ;
76- }
68+ Message = "OK {0}ms" . Fmt ( sw . ElapsedMilliseconds )
69+ } ;
7770 }
78-
79- ret . ResponseStatus = ret . Responses
80- . Where ( x => x . Value . ErrorCode != null )
81- . Select ( x => x . Value )
82- . FirstOrDefault ( ) ;
83-
84- if ( ret . ResponseStatus != null )
71+ catch ( Exception ex )
8572 {
86- Response . StatusCode = 500 ;
87-
88- try {
89- Any ( new ResetConnections ( ) ) ;
90- } catch { }
73+ ret . Responses [ name ] = ex . ToResponseStatus ( ) ;
74+ var body = ex . GetResponseBody ( ) ;
75+ ret . Responses [ name ] . Message = body ;
9176 }
92-
93- return ret ;
9477 }
9578
96- [ Route ( "/reset-connections" ) ]
97- public class ResetConnections { }
79+ ret . ResponseStatus = ret . Responses
80+ . Where ( x => x . Value . ErrorCode != null )
81+ . Select ( x => x . Value )
82+ . FirstOrDefault ( ) ;
9883
99- public object Any ( ResetConnections request )
84+ if ( ret . ResponseStatus != null )
10085 {
101- return Db . Column < bool > (
102- @"SELECT pg_terminate_backend(pid)
86+ Response . StatusCode = 500 ;
87+
88+ try {
89+ Any ( new ResetConnections ( ) ) ;
90+ } catch { }
91+ }
92+
93+ return ret ;
94+ }
95+
96+ [ Route ( "/reset-connections" ) ]
97+ public class ResetConnections { }
98+
99+ public object Any ( ResetConnections request )
100+ {
101+ return Db . Column < bool > (
102+ @"SELECT pg_terminate_backend(pid)
103103 FROM pg_stat_activity
104104 WHERE pid <> pg_backend_pid()
105105 AND state = 'idle'
106106 AND state_change < current_timestamp - INTERVAL '5' MINUTE" ) ;
107- }
108107 }
109-
110108}
0 commit comments