Adding ImageResizer library

--HG--
branch : 1.x
extra : rebase_source : 606c5b161a35f4ede53cfa8df9a08bbd8cb9386a
This commit is contained in:
Sebastien Ros
2013-03-04 10:07:08 -08:00
parent a13970ec0a
commit d3bd1ebd97
11 changed files with 521 additions and 141 deletions

Binary file not shown.

View File

@@ -0,0 +1,23 @@
Please visit the web page at
http://imageresizing.net/licenses/
The core and 18 plugins are free and open-source, under a modified MIT license called the Freedom license.
See http://imageresizing.net/licenses/freedom
The following DLLs are under the Freedom license:
* ImageResizer.dll
* ImageResizer.Mvc.dll
* ImageResizer.Plugins.Logging.dll
Development of this project is funded by people purchasing Pro and Enterprise licenses
to the 4 paid plugin bundles. Both Pro and Enterprise licenses are as MIT-like as possible,
allowing redistribution, modification, and sub-licensing.
The free trial license permits use of the paid plugins for development and testing purposes, but not for production use.
http://imageresizing.net/licenses/trial
Once you begin using them on a production server, you will need a Pro or Enterprise-wide license.
See http://imageresizing.net/plugins for information on buying licuenses.

View File

@@ -1,12 +1,16 @@
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace Orchard.MediaProcessing.Descriptors.Filter {
public class FilterContext {
public dynamic State { get; set; }
public Image Image { get; set; }
public ImageFormat ImageFormat { get; set; }
public Stream Media { get; set; }
public string Format { get; set; }
public string FilePath { get; set; }
/// <summary>
/// Whether the module should save the altered image or not.
/// For instance if a filter saves the media then it should set it to<value>False</value>.
/// </summary>
public bool Saved { get; set; }
}
}

View File

@@ -1,6 +1,6 @@
Name: Media Processing
AntiForgery: enabled
Author: The Orchard Team
Author: John Murdock, Sébastien Ros
Website: http://orchardproject.net
Version: 1.0
OrchardVersion: 1.0

View File

@@ -46,6 +46,10 @@
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="ImageResizer">
<HintPath>..\..\..\..\lib\imageresizer\ImageResizer.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
<Reference Include="System.Data" />
@@ -108,8 +112,9 @@
<Compile Include="Models\FilterRecord.cs" />
<Compile Include="Models\ImageProfilePart.cs" />
<Compile Include="Models\ImageProfilePartRecord.cs" />
<Compile Include="Providers\Filters\CropFilter.cs" />
<Compile Include="Providers\Filters\ImageFormatFilter.cs" />
<None Include="Providers\Filters\ConstrainFilter.cs" />
<None Include="Providers\Filters\CropFilter.cs" />
<None Include="Providers\Filters\ImageFormatFilter.cs" />
<Compile Include="Providers\Filters\ResizeFilter.cs" />
<Compile Include="Services\IImageFilterProvider.cs" />
<Compile Include="Services\IImageProcessingFileNameProvider.cs" />

View File

@@ -0,0 +1,97 @@
using System;
using System.Web.Mvc;
using ImageResizer;
using Orchard.DisplayManagement;
using Orchard.Forms.Services;
using Orchard.Localization;
using Orchard.MediaProcessing.Descriptors.Filter;
using Orchard.MediaProcessing.Services;
namespace Orchard.MediaProcessing.Providers.Filters {
public class ConstrainFilter : IImageFilterProvider {
public ConstrainFilter() {
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void Describe(DescribeFilterContext describe) {
describe.For("Transform", T("Transform"), T("Transform"))
.Element("Constrain", T("Constrain"), T("Constrains the dimensions of an image either by with of by height"),
ApplyFilter,
DisplayFilter,
"ContrainImageFilter"
);
}
public void ApplyFilter(FilterContext context) {
var value = (int)context.State.Value;
var axis = (string)context.State.Axis;
var settings = new ResizeSettings {
Mode = FitMode.Max
};
switch (axis) {
case "width":
settings.Width = value;
break;
case "height":
settings.Height = value;
break;
}
context.Media = result;
}
public LocalizedString DisplayFilter(FilterContext context) {
var value = (int)context.State.Value;
var axis = (string)context.State.Axis;
return axis == "height"
? T("Constrain to {0}px high", value)
: T("Constrain to {0}px wide", value);
}
}
public class ConstrainFilterFilterForms : IFormProvider {
protected dynamic Shape { get; set; }
public Localizer T { get; set; }
public ConstrainFilterFilterForms(
IShapeFactory shapeFactory) {
Shape = shapeFactory;
T = NullLocalizer.Instance;
}
public void Describe(DescribeContext context) {
Func<IShapeFactory, object> form =
shape => {
var f = Shape.Form(
Id: "ContrainImageFilter",
_Axis: Shape.SelectList(
Id: "axis", Name: "Axis",
Title: T("Axis"),
Size: 1,
Multiple: false
),
_Height: Shape.Textbox(
Id: "value", Name: "Value",
Title: T("Value"),
Description: T("The value in pixel the selected axis should be constrained to. Mandatory."),
Classes: new[] {"text-small"})
);
f._Axis.Add(new SelectListItem { Value = "height", Text = T("Height").Text });
f._Axis.Add(new SelectListItem { Value = "width", Text = T("Width").Text });
return f;
};
context.Form("ContrainImageFilter", form);
}
}
}

View File

@@ -25,28 +25,28 @@ namespace Orchard.MediaProcessing.Providers.Filters {
public void ApplyFilter(FilterContext context) {
var newHeight = int.Parse(context.State.Height);
newHeight = newHeight > 0 ? newHeight : context.Image.Height;
var heightFactor = (float) context.Image.Height/newHeight;
newHeight = newHeight > 0 ? newHeight : context.Media.Height;
var heightFactor = (float) context.Media.Height/newHeight;
var newWidth = int.Parse(context.State.Width);
newWidth = newWidth > 0 ? newWidth : context.Image.Width;
var widthFactor = context.Image.Width/newWidth;
newWidth = newWidth > 0 ? newWidth : context.Media.Width;
var widthFactor = context.Media.Width/newWidth;
if (widthFactor != heightFactor) {
if (widthFactor > heightFactor) {
newHeight = Convert.ToInt32(context.Image.Height/widthFactor);
newHeight = Convert.ToInt32(context.Media.Height/widthFactor);
}
else {
newWidth = Convert.ToInt32(context.Image.Width/heightFactor);
newWidth = Convert.ToInt32(context.Media.Width/heightFactor);
}
}
var newImage = new Bitmap(newWidth, newHeight);
using (var graphics = Graphics.FromImage(newImage)) {
graphics.DrawImage(context.Image, 0, 0, new Rectangle(0, 0, newWidth, newHeight), GraphicsUnit.Pixel);
graphics.DrawImage(context.Media, 0, 0, new Rectangle(0, 0, newWidth, newHeight), GraphicsUnit.Pixel);
}
context.Image = newImage;
context.Media = newImage;
}
public LocalizedString DisplayFilter(FilterContext context) {

View File

@@ -26,8 +26,8 @@ namespace Orchard.MediaProcessing.Providers.Filters {
}
public void ApplyFilter(FilterContext context) {
context.ImageFormat = ImageFormatConverter.ToImageFormat((ImageFormats)Enum.Parse(typeof (ImageFormats), (string)context.State.ImageFormat));
context.FilePath = Path.ChangeExtension(context.FilePath, context.ImageFormat.ToString().ToLower());
context.Format = ImageFormatConverter.ToImageFormat((ImageFormats)Enum.Parse(typeof (ImageFormats), (string)context.State.ImageFormat));
context.FilePath = Path.ChangeExtension(context.FilePath, context.Format.ToString().ToLower());
}
public LocalizedString DisplayFilter(FilterContext context) {

View File

@@ -1,6 +1,8 @@
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using ImageResizer;
using Orchard.DisplayManagement;
using Orchard.Forms.Services;
using Orchard.Localization;
@@ -17,7 +19,7 @@ namespace Orchard.MediaProcessing.Providers.Filters {
public void Describe(DescribeFilterContext describe) {
describe.For("Transform", T("Transform"), T("Transform"))
.Element("Resize", T("Resize"), T("Resizes to a fixed height and width"),
.Element("Resize", T("Resize"), T("Resizes using predefined height or width."),
ApplyFilter,
DisplayFilter,
"ResizeFilter"
@@ -25,32 +27,18 @@ namespace Orchard.MediaProcessing.Providers.Filters {
}
public void ApplyFilter(FilterContext context) {
var newHeight = int.Parse((string)context.State.Height);
newHeight = newHeight > 0 ? newHeight : context.Image.Height;
var heightFactor = (float) context.Image.Height/newHeight;
int witdh = context.State.Width;
int height = context.State.Height;
var newWidth = int.Parse((string)context.State.Width);
newWidth = newWidth > 0 ? newWidth : context.Image.Width;
var widthFactor = context.Image.Width/newWidth;
var settings = new ResizeSettings {
Mode = FitMode.Max,
Height = height,
Width = witdh
};
if (widthFactor != heightFactor) {
if (widthFactor > heightFactor) {
newHeight = Convert.ToInt32(context.Image.Height/widthFactor);
}
else {
newWidth = Convert.ToInt32(context.Image.Width/heightFactor);
}
}
var newImage = new Bitmap(newWidth, newHeight);
using (var graphics = Graphics.FromImage(newImage)) {
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.DrawImage(context.Image, 0, 0, newWidth, newHeight);
}
context.Image = newImage;
var result = new MemoryStream();
ImageBuilder.Current.Build(context.Media, result, settings);
context.Media = result;
}
public LocalizedString DisplayFilter(FilterContext context) {
@@ -73,16 +61,17 @@ namespace Orchard.MediaProcessing.Providers.Filters {
shape => {
var f = Shape.Form(
Id: "ImageResizeFilter",
_Height: Shape.Textbox(
Id: "height", Name: "Height",
Title: T("Height"),
Description: T("The height in pixels, 0 to allow any value."),
Classes: new[] {"text-small"}),
_Width: Shape.Textbox(
Id: "width", Name: "Width",
Title: T("Width"),
Description: T("The width in pixels, 0 to allow any value."),
Classes: new[] {"text-small"}));
Classes: new[] {"text-small"}),
_Height: Shape.Textbox(
Id: "height", Name: "Height",
Title: T("Height"),
Description: T("The height in pixels, 0 to allow any value."),
Classes: new[] {"text-small"})
);
return f;
};

View File

@@ -1,10 +1,8 @@
using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using Orchard.DisplayManagement;
using Orchard.Environment;
using Orchard.FileSystems.Media;
@@ -13,7 +11,6 @@ using Orchard.Logging;
using Orchard.MediaProcessing.Descriptors.Filter;
using Orchard.MediaProcessing.Media;
using Orchard.MediaProcessing.Services;
using Orchard.Mvc.Html;
using Orchard.Utility.Extensions;
namespace Orchard.MediaProcessing.Shapes {
@@ -38,14 +35,14 @@ namespace Orchard.MediaProcessing.Shapes {
[Shape]
public void ImageUrl(dynamic Display, TextWriter Output, string Profile, string Path) {
var filePath = _fileNameProvider.Value.GetFileName(Profile, Path);
if (string.IsNullOrEmpty(filePath)) {
if (string.IsNullOrEmpty(filePath) || _storageProvider.Value.GetFile(filePath) == null) {
try {
var profilePart = _profileService.Value.GetImageProfileByName(Profile);
if (profilePart == null)
return;
var image = GetImage(Path);
var filterContext = new FilterContext {Image = image, ImageFormat = image.RawFormat, FilePath = _storageProvider.Value.Combine(Profile, CreateDefaultFileName(Path))};
var filterContext = new FilterContext {Media = image, Format = new FileInfo(Path).Extension, FilePath = _storageProvider.Value.Combine(Profile, CreateDefaultFileName(Path))};
foreach (var filter in profilePart.Filters.OrderBy(f => f.Position)) {
var descriptor = _processingManager.Value.DescribeFilters().SelectMany(x => x.Descriptors).FirstOrDefault(x => x.Category == filter.Category && x.Type == filter.Type);
if (descriptor == null)
@@ -60,9 +57,20 @@ namespace Orchard.MediaProcessing.Shapes {
_storageProvider.Value.TryCreateFolder(profilePart.Name);
var newFile = _storageProvider.Value.OpenOrCreate(filterContext.FilePath);
using (var imageStream = newFile.OpenWrite()) {
filterContext.Image.Save(imageStream, filterContext.ImageFormat);
using (var sw = new BinaryWriter(imageStream)) {
filterContext.Media.Seek(0, SeekOrigin.Begin);
using (var sr = new BinaryReader(filterContext.Media)) {
int count;
var buffer = new byte[1024];
while ((count = sr.Read(buffer, 0, buffer.Length)) != 0) {
sw.Write(buffer, 0, count);
}
}
}
}
}
filterContext.Media.Dispose();
filePath = filterContext.FilePath;
}
catch (Exception ex) {
@@ -74,20 +82,20 @@ namespace Orchard.MediaProcessing.Shapes {
}
// TODO: Update this method once the storage provider has been updated
private Image GetImage(string path) {
private Stream GetImage(string path) {
// http://blob.storage-provider.net/my-image.jpg
if (Uri.IsWellFormedUriString(path, UriKind.Absolute)) {
var webClient = new WebClient();
return new Bitmap(webClient.OpenRead(new Uri(path)));
return webClient.OpenRead(new Uri(path));
}
// ~/Media/Default/images/my-image.jpg
if (VirtualPathUtility.IsAppRelative(path)) {
var webClient = new WebClient();
return new Bitmap(webClient.OpenRead(new Uri(_services.Value.WorkContext.HttpContext.Request.Url, VirtualPathUtility.ToAbsolute(path))));
return webClient.OpenRead(new Uri(_services.Value.WorkContext.HttpContext.Request.Url, VirtualPathUtility.ToAbsolute(path)));
}
// images/my-image.jpg
var file = _storageProvider.Value.GetFile(path);
return new Bitmap(file.OpenRead());
return file.OpenRead();
}
private static string CreateDefaultFileName(string path) {

View File

@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<?xml version="1.0" encoding="utf-8"?>
<!--
Note: As an alternative to hand editing this file you can use the
web admin tool to configure settings for your application. Use
@@ -10,29 +10,57 @@
<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<remove name="host"/>
<remove name="pages"/>
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false"/>
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false"/>
<remove name="host" />
<remove name="pages" />
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
</configSections>
<appSettings>
<add key="webpages:Enabled" value="false"/>
<add key="log4net.Config" value="Config\log4net.config"/>
<add key="price.issue.us" value="4.95"/>
<add key="price.issue.ca" value="6.95"/>
<add key="price.issue.any" value="12.95"/>
<add key="price.subscription.us" value="9.90"/>
<add key="price.subscription.ca" value="13.9"/>
<add key="price.subscription.any" value="25.90"/>
<add key="price.vpaper.us" value="4.95"/>
<add key="price.vpaper.ca" value="4.95"/>
<add key="price.vpaper.any" value="4.95"/>
<add key="payment.redirect.vpaper" value="http://www.myvirtualpaper.com/doc/destination-wedding/destination-i-do-magazine---summer-2012/2012060501/#0" />
<!-- staging settings -->
<!--<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
<add key="WepayAccessToken" value="STAGE_176a3ddc53821415dba83d037c327fdaa3e09483fed6c48c6c544cf4fd4cd1ed"/>
<add key="WepayAccountId" value="132855832 "/>
<add key="WepayClientSecret" value="976a2acc48 "/>
<add key="WepayClientId" value="52222"/>
<add key="ProductionMode" value="false" />-->
<!-- production settings -->
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
<add key="WepayAccessToken" value="PRODUCTION_2579019cf8e14cb60277bcbb47d13899aee63b75e821bb024bebe8a8d639672a"/>
<add key="WepayAccountId" value="1614257476"/>
<add key="WepayClientSecret" value="6aed3922a9"/>
<add key="WepayClientId" value="199862"/>
<add key="ProductionMode" value="true" />
</appSettings>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<pages pageBaseType="Orchard.Mvc.ViewEngines.Razor.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Web.WebPages"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
<add namespace="Orchard.Mvc.Html"/>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.WebPages" />
<add namespace="System.Linq" />
<add namespace="System.Collections.Generic" />
<add namespace="Orchard.Mvc.Html" />
</namespaces>
</pages>
</system.web.webPages.razor>
@@ -41,44 +69,44 @@
is easier (default timeout is less than one minute)
-->
<system.transactions>
<defaultSettings timeout="00:30:00"/>
<defaultSettings timeout="00:30:00" />
</system.transactions>
<system.web>
<!--<trust level="Medium" originUrl="" />-->
<httpRuntime requestValidationMode="2.0"/>
<httpRuntime requestValidationMode="2.0" />
<!--
Set compilation debug="true" to insert debugging
symbols into the compiled page. Because this
affects performance, set this value to true only
during development.
-->
<compilation debug="true" targetFramework="4.0" batch="true" numRecompilesBeforeAppRestart="250" optimizeCompilations="true">
<compilation debug="false" targetFramework="4.0" batch="true" numRecompilesBeforeAppRestart="250" optimizeCompilations="true">
<buildProviders>
<add extension=".csproj" type="Orchard.Environment.Extensions.Compilers.CSharpExtensionBuildProviderShim"/>
<add extension=".csproj" type="Orchard.Environment.Extensions.Compilers.CSharpExtensionBuildProviderShim" />
</buildProviders>
<assemblies>
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<remove assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<remove assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<remove assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<remove assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<remove assembly="System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<remove assembly="System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove assembly="System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<remove assembly="System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<remove assembly="System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<remove assembly="System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<remove assembly="System.WorkflowServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<remove assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<remove assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<remove assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove assembly="System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove assembly="System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove assembly="System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<remove assembly="System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<remove assembly="System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<remove assembly="System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<remove assembly="System.WorkflowServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<remove assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<remove assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</assemblies>
</compilation>
<!--
@@ -87,8 +115,9 @@
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms">
<forms loginUrl="~/Users/Account/AccessDenied" timeout="2880"/>
<forms loginUrl="~/Users/Account/AccessDenied" timeout="60" />
</authentication>
<sessionState timeout="60" />
<!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
@@ -96,25 +125,29 @@
it enables developers to configure html error pages
to be displayed in place of a error stack trace.
-->
<customErrors mode="RemoteOnly"/>
<customErrors mode="Off" />
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
<namespaces>
<add namespace="System.Web.Mvc"/>
<add namespace="System.Web.Mvc.Ajax"/>
<add namespace="System.Web.Mvc.Html"/>
<add namespace="System.Web.Routing"/>
<add namespace="System.Linq"/>
<add namespace="System.Collections.Generic"/>
<add namespace="Orchard.Mvc.Html"/>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Linq" />
<add namespace="System.Collections.Generic" />
<add namespace="Orchard.Mvc.Html" />
</namespaces>
</pages>
<httpHandlers>
<!-- see below -->
<clear/>
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
<clear />
<!-- This section registers some static files to be served
<add path="robots.txt" verb="GET" type="System.Web.StaticFileHandler" />
<add path="sitemap.xml" verb="GET" type="System.Web.StaticFileHandler" />
-->
<add path="*" verb="*" type="System.Web.HttpNotFoundHandler" />
</httpHandlers>
<httpModules>
<add name="WarmupHttpModule" type="Orchard.WarmupStarter.WarmupHttpModule, Orchard.WarmupStarter, Version=1.0.20, Culture=neutral"/>
<add name="WarmupHttpModule" type="Orchard.WarmupStarter.WarmupHttpModule, Orchard.WarmupStarter, Version=1.0.20, Culture=neutral" />
</httpModules>
</system.web>
<!--
@@ -122,61 +155,282 @@
Information Services 7.0. It is not necessary for previous version of IIS.
-->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WarmupHttpModule"/>
<add name="WarmupHttpModule" type="Orchard.WarmupStarter.WarmupHttpModule, Orchard.WarmupStarter, Version=1.0.20, Culture=neutral"/>
<staticContent>
<mimeMap fileExtension=".woff" mimeType="application/x-font-woff" />
</staticContent>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="false">
<remove name="WarmupHttpModule" />
<add name="WarmupHttpModule" type="Orchard.WarmupStarter.WarmupHttpModule, Orchard.WarmupStarter, Version=1.0.20, Culture=neutral" />
</modules>
<handlers accessPolicy="Script">
<!-- clear all handlers, prevents executing code file extensions, prevents returning any file contents -->
<clear/>
<clear />
<!-- This section registers some static files to be served
<add name="Robots" path="robots.txt" verb="GET" modules="StaticFileModule" preCondition="integratedMode" resourceType="File" requireAccess="Read" />
<add name="SiteMap" path="sitemap.xml" verb="GET" modules="StaticFileModule" preCondition="integratedMode" resourceType="File" requireAccess="Read" />
-->
<!-- Return 404 for all requests via managed handler. The url routing handler will substitute the mvc request handler when routes match. -->
<add name="NotFound" path="*" verb="*" type="System.Web.HttpNotFoundHandler" preCondition="integratedMode" requireAccess="Script"/>
<add name="NotFound" path="*" verb="*" type="System.Web.HttpNotFoundHandler" preCondition="integratedMode" requireAccess="Script" />
<!-- WebApi -->
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit"/>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0"/>
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<!-- Prevent IIS 7.0 from returning a custom 404/500 error page of its own -->
<httpErrors existingResponse="PassThrough"/>
<httpErrors existingResponse="PassThrough" />
<rewrite>
<rules>
<rule name="AWS entrance" stopProcessing="true">
<match url="(.*$)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="destination.azurewebsites.net" />
</conditions>
</rule>
<rule name="to 'about us'" stopProcessing="true">
<match url="^(the_destination_wedding_magazine)|(about_mag)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/about-us" redirectType="Permanent" />
</rule>
<rule name="to 'articles'" stopProcessing="true">
<match url="^(featured_articles)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/articles" redirectType="Permanent" />
</rule>
<rule name="to 'home'" stopProcessing="true">
<match url="^(buzz)|(testimonials)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com" redirectType="Permanent" />
</rule>
<rule name="to 'subscription'" stopProcessing="true">
<match url="^(subscribe)|(magazine_subscription)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/subscription" redirectType="Permanent" />
</rule>
<rule name="to 'back issues'" stopProcessing="true">
<match url="^(order_backissues)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/back-issues" redirectType="Permanent" />
</rule>
<rule name="to 'sign up'" stopProcessing="true">
<match url="^(sign_up)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/sign-up" redirectType="Permanent" />
</rule>
<rule name="to 'contact form'" stopProcessing="true">
<match url="^(request_adrates)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/contact-form" redirectType="Permanent" />
</rule>
<rule name="to 'advertise'" stopProcessing="true">
<match url="^(media_kit)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/advertise" redirectType="Permanent" />
</rule>
<rule name="to 'contact-us1'" stopProcessing="true">
<match url="^contact/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/contact-us" redirectType="Permanent" />
</rule>
<rule name="to 'contact-us2'" stopProcessing="true">
<match url="^contact_us/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/contact-us" redirectType="Permanent" />
</rule>
<rule name="to 'submission-guidelines'" stopProcessing="true">
<match url="^(submission_guidelines)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/submission-guidelines" redirectType="Permanent" />
</rule>
<rule name="to 'blog'" stopProcessing="true">
<match url="^(_the_blog)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/blog" redirectType="Permanent" />
</rule>
<rule name="Blog /blog" stopProcessing="true">
<match url="(.*)/?$" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="destinationidoblog.com" />
</conditions>
<action type="Redirect" url="http://destinationido.com/blog/{R:1}" redirectType="Permanent" />
</rule>
<rule name="Remove trailing slash or .html" stopProcessing="true">
<match url="(.*)/$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>
<rule name="Remove trailing .html" stopProcessing="true">
<match url="(.*)\.html$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>
<rule name="to 'did'" stopProcessing="true">
<match url="^(did)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/" redirectType="Permanent" />
</rule>
<rule name="quick facts antigua" stopProcessing="true">
<match url="^Quick_Facts/Antigua_and_Barbuda/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/antigua-and-barbuda" redirectType="Permanent" />
</rule>
<rule name="quick facts big-islan" stopProcessing="true">
<match url="^Quick_Facts/Big_Island_of_Hawaii/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/big-island-of-hawaii" redirectType="Permanent" />
</rule>
<rule name="quick facts british-virginia" stopProcessing="true">
<match url="^Quick_Facts/British_Virgin_Islands/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/british-virgin-islands" redirectType="Permanent" />
</rule>
<rule name="quick facts cayman" stopProcessing="true">
<match url="^Quick_Facts/Cayman_Islands/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/cayman-islands-2" redirectType="Permanent" />
</rule>
<rule name="quick facts cayman" stopProcessing="true">
<match url="^Quick_Facts/Dominican_Republic/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/Dominican-Republic" redirectType="Permanent" />
</rule>
<rule name="quick great britain" stopProcessing="true">
<match url="^Quick_Facts/Great_Britain/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/great-britain" redirectType="Permanent" />
</rule>
<rule name="quick new mexico" stopProcessing="true">
<match url="^Quick_Facts/New_Mexico/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/new-mexico" redirectType="Permanent" />
</rule>
<rule name="quick new york" stopProcessing="true">
<match url="^Quick_Facts/New_York/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/new-york" redirectType="Permanent" />
</rule>
<rule name="quick new zealand" stopProcessing="true">
<match url="^Quick_Facts/New_Zealand/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/new-zealand" redirectType="Permanent" />
</rule>
<rule name="quick new jersey" stopProcessing="true">
<match url="^Quick_Facts/New_Jersey/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/new-jersey" redirectType="Permanent" />
</rule>
<rule name="quick fact North_Carolina" stopProcessing="true">
<match url="^Quick_Facts/North_Carolina/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/north-carolina" redirectType="Permanent" />
</rule>
<rule name="quick fact Nova_Scotia" stopProcessing="true">
<match url="^Quick_Facts/Nova_Scotia/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/nova-scotia" redirectType="Permanent" />
</rule>
<rule name="quick fact Puerto_Rico" stopProcessing="true">
<match url="^Quick_Facts/Puerto_Rico/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/puerto-rico" redirectType="Permanent" />
</rule>
<rule name="quick fact Rhode_Island" stopProcessing="true">
<match url="^Quick_Facts/Rhode_Island/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/rhode-island" redirectType="Permanent" />
</rule>
<rule name="quick fact St._Kitts" stopProcessing="true">
<match url="^Quick_Facts/St\._Kitts/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/st-kitts" redirectType="Permanent" />
</rule>
<rule name="quick fact St._Lucia" stopProcessing="true">
<match url="^Quick_Facts/St\._Lucia/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/st-lucia" redirectType="Permanent" />
</rule>
<rule name="quick fact _Vincent_the_Grenadines" stopProcessing="true">
<match url="^Quick_Facts/St\._Vincent_&amp;_the_Grenadines/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/st-vincent-the-grenadines" redirectType="Permanent" />
</rule>
<rule name="quick fact Turcs_and_Caicos" stopProcessing="true">
<match url="^Quick_Facts/Turcs_and_Caicos/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/turcs-and-caicos" redirectType="Permanent" />
</rule>
<rule name="quick fact US_Virgin_Islands" stopProcessing="true">
<match url="^Quick_Facts/US_Virgin_Islands/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/us-virgin-islands" redirectType="Permanent" />
</rule>
<rule name="quick facts" stopProcessing="true">
<match url="^Quick_Facts/([^/]*)/?$" ignoreCase="true" />
<action type="Redirect" url="http://destinationido.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="Domain Name Check">
<match url="(.*$)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" negate="true" pattern="destinationido.com" />
</conditions>
<action type="Redirect" url="http://destinationido.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="App_Data/Dependencies"/>
<probing privatePath="App_Data/Dependencies" />
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0"/>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
<assemblyIdentity name="System.Web.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages.Deployment" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
<assemblyIdentity name="System.Web.WebPages.Deployment" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-3.3.1.4000" newVersion="3.3.1.4000"/>
<assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.1.4000" newVersion="3.3.1.4000" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da"/>
<bindingRedirect oldVersion="2.2.0.0-2.6.3.862" newVersion="2.6.3.862"/>
<assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" />
<bindingRedirect oldVersion="2.2.0.0-2.6.3.862" newVersion="2.6.3.862" />
</dependentAssembly>
</assemblyBinding>
</runtime>