// Copyright © 2014 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System; using System.Net.Security; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; namespace CefSharp.Internals { public class BrowserProcessServiceHost : ServiceHost { private const long OneHundredAndTwentyEightMegaBytesInBytes = 128 * 1024 * 1024; public JavascriptObjectRepository JavascriptObjectRepository { get; private set; } public BrowserProcessServiceHost(JavascriptObjectRepository javascriptObjectRepository, int parentProcessId, int browserId, IJavascriptCallbackFactory callbackFactory) : base(typeof(BrowserProcessService), new Uri[0]) { JavascriptObjectRepository = javascriptObjectRepository; var serviceName = RenderprocessClientFactory.GetServiceName(parentProcessId, browserId); Description.ApplyServiceBehavior(() => new ServiceDebugBehavior(), p => p.IncludeExceptionDetailInFaults = true); var binding = CreateBinding(); var endPoint = AddServiceEndpoint( typeof(IBrowserProcess), binding, new Uri(serviceName) ); endPoint.Contract.ProtectionLevel = ProtectionLevel.None; endPoint.Behaviors.Add(new JavascriptCallbackEndpointBehavior(callbackFactory)); } protected override void OnClosed() { base.OnClosed(); JavascriptObjectRepository = null; } public static CustomBinding CreateBinding() { var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None); binding.MaxReceivedMessageSize = OneHundredAndTwentyEightMegaBytesInBytes; binding.ReceiveTimeout = TimeSpan.MaxValue; binding.SendTimeout = TimeSpan.MaxValue; binding.OpenTimeout = TimeSpan.MaxValue; binding.CloseTimeout = TimeSpan.MaxValue; binding.ReaderQuotas.MaxStringContentLength = int.MaxValue; binding.ReaderQuotas.MaxArrayLength = int.MaxValue; binding.ReaderQuotas.MaxDepth = int.MaxValue; binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue; binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue; // Ensure binding connection stays open indefinitely until closed var customBinding = new CustomBinding(binding); var connectionSettings = customBinding.Elements.Find().ConnectionPoolSettings; connectionSettings.IdleTimeout = TimeSpan.MaxValue; connectionSettings.MaxOutboundConnectionsPerEndpoint = 0; return customBinding; } } }