PageRenderTime 47ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/src/ServiceStack/HostContext.cs

http://github.com/ServiceStack/ServiceStack
C# | 339 lines | 240 code | 66 blank | 33 comment | 23 complexity | ebd47c3a033c129ac1fb9844d24f1b73 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.IO;
  5. using System.Net;
  6. using System.Runtime.Serialization;
  7. using System.Threading.Tasks;
  8. using System.Web;
  9. using Funq;
  10. using ServiceStack.Caching;
  11. using ServiceStack.Configuration;
  12. using ServiceStack.Host;
  13. using ServiceStack.IO;
  14. using ServiceStack.Metadata;
  15. using ServiceStack.MiniProfiler;
  16. using ServiceStack.Web;
  17. namespace ServiceStack
  18. {
  19. public static class HostContext
  20. {
  21. public static RequestContext RequestContext => RequestContext.Instance;
  22. public static ServiceStackHost AppHost => ServiceStackHost.Instance;
  23. public static AsyncContext Async = new AsyncContext();
  24. public static ServiceStackHost AssertAppHost()
  25. {
  26. if (ServiceStackHost.Instance == null)
  27. throw new ConfigurationErrorsException(
  28. "ServiceStack: AppHost does not exist or has not been initialized. " +
  29. "Make sure you have created an AppHost and started it with 'new AppHost().Init();' " +
  30. " in your Global.asax Application_Start() or alternative Application StartUp");
  31. return ServiceStackHost.Instance;
  32. }
  33. #if !NETSTANDARD2_0
  34. public static bool IsAspNetHost => ServiceStackHost.Instance is AppHostBase;
  35. public static bool IsHttpListenerHost => ServiceStackHost.Instance is Host.HttpListener.HttpListenerBase;
  36. public static bool IsNetCore => false;
  37. #else
  38. public static bool IsAspNetHost => false;
  39. public static bool IsHttpListenerHost => false;
  40. public static bool IsNetCore => true;
  41. #endif
  42. public static T TryResolve<T>() => AssertAppHost().TryResolve<T>();
  43. public static T Resolve<T>() => AssertAppHost().Resolve<T>();
  44. public static Container Container => AssertAppHost().Container;
  45. public static ServiceController ServiceController => AssertAppHost().ServiceController;
  46. public static MetadataPagesConfig MetadataPagesConfig => AssertAppHost().MetadataPagesConfig;
  47. public static IContentTypes ContentTypes => AssertAppHost().ContentTypes;
  48. public static HostConfig Config => AssertAppHost().Config;
  49. public static IAppSettings AppSettings => AssertAppHost().AppSettings;
  50. public static ServiceMetadata Metadata => AssertAppHost().Metadata;
  51. public static string ServiceName => AssertAppHost().ServiceName;
  52. public static bool DebugMode => AppHost?.Config?.DebugMode == true;
  53. public static bool StrictMode => AppHost?.Config?.StrictMode == true;
  54. public static bool TestMode
  55. {
  56. get => ServiceStackHost.Instance != null && ServiceStackHost.Instance.TestMode;
  57. set => ServiceStackHost.Instance.TestMode = value;
  58. }
  59. public static bool ApplyCustomHandlerRequestFilters(IRequest httpReq, IResponse httpRes)
  60. {
  61. return AssertAppHost().ApplyCustomHandlerRequestFilters(httpReq, httpRes);
  62. }
  63. public static bool ApplyPreRequestFilters(IRequest httpReq, IResponse httpRes)
  64. {
  65. return AssertAppHost().ApplyPreRequestFilters(httpReq, httpRes);
  66. }
  67. public static Task ApplyRequestFiltersAsync(IRequest httpReq, IResponse httpRes, object requestDto)
  68. {
  69. return AssertAppHost().ApplyRequestFiltersAsync(httpReq, httpRes, requestDto);
  70. }
  71. public static Task ApplyResponseFiltersAsync(IRequest httpReq, IResponse httpRes, object response)
  72. {
  73. return AssertAppHost().ApplyResponseFiltersAsync(httpReq, httpRes, response);
  74. }
  75. /// <summary>
  76. /// Read/Write Virtual FileSystem. Defaults to FileSystemVirtualPathProvider
  77. /// </summary>
  78. public static IVirtualFiles VirtualFiles => AssertAppHost().VirtualFiles;
  79. /// <summary>
  80. /// Cascading collection of virtual file sources, inc. Embedded Resources, File System, In Memory, S3
  81. /// </summary>
  82. public static IVirtualPathProvider VirtualFileSources => AssertAppHost().VirtualFileSources;
  83. /// <summary>
  84. /// The WebRoot VFS Directory of VirtualFilesSources
  85. /// </summary>
  86. public static IVirtualDirectory RootDirectory => AssertAppHost().RootDirectory;
  87. /// <summary>
  88. /// The ContentRoot VFS Directory of VirtualFiles
  89. /// </summary>
  90. public static IVirtualDirectory ContentRootDirectory => AssertAppHost().ContentRootDirectory;
  91. /// <summary>
  92. /// The FileSystem VirtualFiles provider in VirtualFileSources
  93. /// </summary>
  94. public static FileSystemVirtualFiles FileSystemVirtualFiles => AssertAppHost().VirtualFileSources.GetFileSystemVirtualFiles();
  95. /// <summary>
  96. /// The Memory VirtualFiles provider in VirtualFileSources
  97. /// </summary>
  98. public static MemoryVirtualFiles MemoryVirtualFiles => AssertAppHost().VirtualFileSources.GetMemoryVirtualFiles();
  99. /// <summary>
  100. /// The GistVirtualFiles provider in VirtualFileSources (if any)
  101. /// </summary>
  102. public static GistVirtualFiles GistVirtualFiles => AssertAppHost().VirtualFileSources.GetGistVirtualFiles();
  103. public static ICacheClient Cache => TryResolve<ICacheClient>();
  104. public static MemoryCacheClient LocalCache => TryResolve<MemoryCacheClient>();
  105. /// <summary>
  106. /// Call to signal the completion of a ServiceStack-handled Request
  107. /// </summary>
  108. internal static void CompleteRequest(IRequest request)
  109. {
  110. try
  111. {
  112. AssertAppHost().OnEndRequest(request);
  113. }
  114. catch (Exception) { }
  115. }
  116. public static IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
  117. {
  118. return AssertAppHost().CreateServiceRunner<TRequest>(actionContext);
  119. }
  120. internal static object ExecuteService(object request, IRequest httpReq)
  121. {
  122. using (Profiler.Current.Step("Execute Service"))
  123. {
  124. return AssertAppHost().ServiceController.Execute(request, httpReq);
  125. }
  126. }
  127. public static T AssertPlugin<T>() where T : class, IPlugin
  128. {
  129. var appHost = AppHost;
  130. var plugin = appHost.GetPlugin<T>();
  131. if (plugin == null)
  132. throw new NotImplementedException($"Plugin '{typeof(T).Name}' has not been registered.");
  133. return plugin;
  134. }
  135. public static T GetPlugin<T>() where T : class, IPlugin
  136. {
  137. var appHost = AppHost;
  138. return appHost?.GetPlugin<T>();
  139. }
  140. public static bool HasPlugin<T>() where T : class, IPlugin
  141. {
  142. var appHost = AppHost;
  143. return appHost != null && appHost.HasPlugin<T>();
  144. }
  145. public static void Release(object service)
  146. {
  147. if (ServiceStackHost.Instance != null)
  148. {
  149. ServiceStackHost.Instance.Release(service);
  150. }
  151. else
  152. {
  153. using (service as IDisposable) { }
  154. }
  155. }
  156. public static UnauthorizedAccessException UnauthorizedAccess(RequestAttributes requestAttrs)
  157. {
  158. return new UnauthorizedAccessException($"Request with '{requestAttrs}' is not allowed");
  159. }
  160. public static string ResolveLocalizedString(string text, IRequest request = null)
  161. {
  162. return AssertAppHost().ResolveLocalizedString(text, request);
  163. }
  164. public static string ResolveAbsoluteUrl(string virtualPath, IRequest httpReq)
  165. {
  166. return AssertAppHost().ResolveAbsoluteUrl(virtualPath, httpReq);
  167. }
  168. public static string ResolvePhysicalPath(string virtualPath, IRequest httpReq)
  169. {
  170. return AssertAppHost().ResolvePhysicalPath(virtualPath, httpReq);
  171. }
  172. private static string defaultOperationNamespace;
  173. public static string DefaultOperationNamespace
  174. {
  175. get => defaultOperationNamespace ??= GetDefaultNamespace();
  176. set => defaultOperationNamespace = value;
  177. }
  178. public static string GetDefaultNamespace()
  179. {
  180. if (!string.IsNullOrEmpty(defaultOperationNamespace)) return null;
  181. foreach (var operationType in Metadata.RequestTypes)
  182. {
  183. var attrs = operationType.AllAttributes<DataContractAttribute>();
  184. if (attrs.Length <= 0) continue;
  185. var attr = attrs[0];
  186. if (string.IsNullOrEmpty(attr.Namespace)) continue;
  187. return attr.Namespace;
  188. }
  189. return null;
  190. }
  191. public static Task<object> RaiseServiceException(IRequest httpReq, object request, Exception ex) =>
  192. AssertAppHost().OnServiceException(httpReq, request, ex);
  193. public static Task RaiseUncaughtException(IRequest httpReq, IResponse httpRes, string operationName, Exception ex) =>
  194. AssertAppHost().OnUncaughtException(httpReq, httpRes, operationName, ex);
  195. public static Task RaiseGatewayException(IRequest httpReq, object request, Exception ex) =>
  196. AssertAppHost().OnGatewayException(httpReq, request, ex);
  197. public static async Task RaiseAndHandleException(IRequest httpReq, IResponse httpRes, string operationName, Exception ex)
  198. {
  199. if (!httpReq.Items.ContainsKey(nameof(ServiceStackHost.OnServiceException)))
  200. await AssertAppHost().OnUncaughtException(httpReq, httpRes, operationName, ex);
  201. if (httpRes.IsClosed)
  202. return;
  203. await AssertAppHost().HandleResponseException(httpReq, httpRes, operationName, ex);
  204. }
  205. #if !NETSTANDARD2_0
  206. /// <summary>
  207. /// Resolves and auto-wires a ServiceStack Service from a ASP.NET HttpContext.
  208. /// </summary>
  209. public static T ResolveService<T>(HttpContextBase httpCtx = null) where T : class, IRequiresRequest
  210. {
  211. var httpReq = httpCtx != null ? httpCtx.ToRequest() : GetCurrentRequest();
  212. return ResolveService(httpReq, AssertAppHost().Container.Resolve<T>());
  213. }
  214. /// <summary>
  215. /// Resolves and auto-wires a ServiceStack Service from a HttpListenerContext.
  216. /// </summary>
  217. public static T ResolveService<T>(HttpListenerContext httpCtx) where T : class, IRequiresRequest
  218. {
  219. return ResolveService(httpCtx.ToRequest(), AssertAppHost().Container.Resolve<T>());
  220. }
  221. #endif
  222. /// <summary>
  223. /// Resolves and auto-wires a ServiceStack Service.
  224. /// </summary>
  225. public static T ResolveService<T>(IRequest httpReq) where T : class, IRequiresRequest
  226. {
  227. return ResolveService(httpReq, AssertAppHost().Container.Resolve<T>());
  228. }
  229. public static T ResolveService<T>(IRequest httpReq, T service)
  230. {
  231. if (service is IRequiresRequest hasRequest)
  232. {
  233. httpReq.SetInProcessRequest();
  234. hasRequest.Request = httpReq;
  235. }
  236. return service;
  237. }
  238. public static bool HasValidAuthSecret(IRequest httpReq)
  239. {
  240. return AssertAppHost().HasValidAuthSecret(httpReq);
  241. }
  242. public static bool HasFeature(Feature feature)
  243. {
  244. return AssertAppHost().HasFeature(feature);
  245. }
  246. public static IRequest GetCurrentRequest()
  247. {
  248. var req = AssertAppHost().TryGetCurrentRequest();
  249. if (req == null)
  250. throw new NotImplementedException(ErrorMessages.HostDoesNotSupportSingletonRequest);
  251. return req;
  252. }
  253. public static IRequest TryGetCurrentRequest()
  254. {
  255. return AssertAppHost().TryGetCurrentRequest();
  256. }
  257. public static int FindFreeTcpPort(int startingFrom=5000, int endingAt=65535)
  258. {
  259. var tcpEndPoints = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners();
  260. var activePorts = new HashSet<int>();
  261. foreach (var endPoint in tcpEndPoints)
  262. {
  263. activePorts.Add(endPoint.Port);
  264. }
  265. for (var port = startingFrom; port < endingAt; port++)
  266. {
  267. if (!activePorts.Contains(port))
  268. return port;
  269. }
  270. return -1;
  271. }
  272. }
  273. }