private static IJsonRpcServiceHost BuildServiceHost(ISession session, TextWriter logWriter, IJsonRpcContractResolver contractResolver, bool debugMode) { var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new DebugLoggerProvider(null)); var builder = new ServiceHostBuilder { ContractResolver = contractResolver, Session = session, Options = JsonRpcServiceHostOptions.ConsistentResponseSequence, LoggerFactory = loggerFactory }; builder.UseCancellationHandling(); builder.Register(typeof(Program).GetTypeInfo().Assembly); if (debugMode) { // Log all the client-to-server calls. builder.Intercept(async(context, next) => { lock (logWriter) logWriter.WriteLine("> {0}", context.Request); await next(); lock (logWriter) logWriter.WriteLine("< {0}", context.Response); }); } return(builder.Build()); }
/// <summary> /// Interprets any <see cref="OperationCanceledException" /> thrown by the service /// as <c>RequestCancelled</c> error per definition in Language Server Protocol. /// </summary> public static void UseCancellationHandling(this ServiceHostBuilder builder) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } builder.Intercept(async(context, next) => { try { await next(); } catch (OperationCanceledException ex) { if (ex.CancellationToken == context.CancellationToken || ex.CancellationToken == CancellationToken.None) { context.Response.Error = new ResponseError(Utility.RequestCancelledErrorCode, ex.Message); } } }); }