Files
Umbraco-CMS/src/Umbraco.Web/BatchedWebServiceServerMessenger.cs
2015-03-05 10:49:22 +01:00

63 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using Umbraco.Core.Sync;
namespace Umbraco.Web
{
internal class BatchedWebServiceServerMessenger : Core.Sync.BatchedWebServiceServerMessenger
{
internal BatchedWebServiceServerMessenger()
: base(GetBatch)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
internal BatchedWebServiceServerMessenger(string login, string password)
: base(login, password, GetBatch)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
internal BatchedWebServiceServerMessenger(string login, string password, bool useDistributedCalls)
: base(login, password, useDistributedCalls, GetBatch)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
public BatchedWebServiceServerMessenger(Func<Tuple<string, string>> getLoginAndPassword)
: base(getLoginAndPassword, GetBatch)
{
UmbracoModule.EndRequest += UmbracoModule_EndRequest;
}
private static ICollection<RefreshInstructionEnvelope> GetBatch(bool ensure)
{
var httpContext = UmbracoContext.Current == null ? null : UmbracoContext.Current.HttpContext;
if (httpContext == null)
{
if (ensure)
throw new NotSupportedException("Cannot execute without a valid/current UmbracoContext with an HttpContext assigned.");
return null;
}
var key = typeof(BatchedWebServiceServerMessenger).Name;
// no thread-safety here because it'll run in only 1 thread (request) at a time
var batch = (ICollection<RefreshInstructionEnvelope>)httpContext.Items[key];
if (batch == null && ensure)
httpContext.Items[key] = batch = new List<RefreshInstructionEnvelope>();
return batch;
}
void UmbracoModule_EndRequest(object sender, EventArgs e)
{
FlushBatch();
}
protected override void ProcessBatch(RefreshInstructionEnvelope[] batch)
{
Message(batch);
}
}
}