using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.IO; using System.Runtime.InteropServices; using Microsoft.Build.Framework; using Microsoft.Build.BuildEngine; using Microsoft.Build.Utilities; namespace Elsinore.Engine.MSBuild.Web { public class BuildHandler : IHttpHandler { public const string BuildFileKey = "BuildFile"; public const string TargetParam = "__Target"; public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string[] targets = null; BuildPropertyGroup buildPropertyGroup = new BuildPropertyGroup(); foreach (string key in context.Request.Params.AllKeys) { string value = context.Request.Params[key]; if (string.Equals(key, BuildHandler.TargetParam, StringComparison.InvariantCultureIgnoreCase)) { targets = new string[] { value }; } else { buildPropertyGroup.SetProperty(key, value); } } string buildFileVirtualPath = ConfigurationManager.AppSettings[BuildHandler.BuildFileKey]; Assert.NonNull(buildFileVirtualPath, BuildHandler.BuildFileKey, "Must be set in appSettings"); string buildFilePhysicalPath = context.Request.MapPath(buildFileVirtualPath); Assert.True(File.Exists(buildFilePhysicalPath), BuildHandler.BuildFileKey, "File must exist"); ILogger logger = new MessageLogger(context.Response.Output); Microsoft.Build.BuildEngine.Engine engine = new Microsoft.Build.BuildEngine.Engine(); engine.BinPath = RuntimeEnvironment.GetRuntimeDirectory(); engine.RegisterLogger(logger); if (!engine.BuildProjectFile(buildFilePhysicalPath, targets, buildPropertyGroup)) { context.Response.StatusCode = 500; } engine.UnregisterAllLoggers(); } private class MessageLogger : Logger { private static readonly MessageImportance[] IgnoreMessageImportance = { MessageImportance.Low }; private static readonly string[] IgnoreWarningCodes = { "MSB4056" }; private TextWriter writer; public MessageLogger(TextWriter writer) { Assert.ArgumentNonNull(this.writer = writer, "writer"); } public override void Initialize(IEventSource eventSource) { eventSource.ErrorRaised += delegate(object sender, BuildErrorEventArgs e) { this.writer.WriteLine(e.Message); }; eventSource.MessageRaised += delegate(object sender, BuildMessageEventArgs e) { if (Array.IndexOf(MessageLogger.IgnoreMessageImportance, e.Importance) == -1) this.writer.WriteLine(e.Message); }; eventSource.WarningRaised += delegate(object sender, BuildWarningEventArgs e) { if (Array.IndexOf(MessageLogger.IgnoreWarningCodes, e.Code) == -1) this.writer.WriteLine(e.Message); }; } } } }