From 5c2dc5db11b63fd7b031aa265e8d51c10f2676f9 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 13 Jan 2015 17:29:27 -0800 Subject: [PATCH] [Fixes#1792]Separate XML serializers to Microsoft.AspNet.Mvc.Xml --- Mvc.sln | 43 ++++-- samples/MvcSample.Web/project.json | 1 + samples/TagHelperSample.Web/project.json | 1 + .../ActionResults/SerializableError.cs | 51 +------ .../project.json | 5 +- ...icrosoft.AspNet.Mvc.WebApiCompatShim.kproj | 9 +- .../project.json | 8 +- .../Formatters/FormattingUtilities.cs | 4 +- ...XmlDataContractSerializerInputFormatter.cs | 8 +- ...mlDataContractSerializerOutputFormatter.cs | 13 +- .../Formatters/XmlSerializerInputFormatter.cs | 8 +- .../XmlSerializerOutputFormatter.cs | 13 +- .../Microsoft.AspNet.Mvc.Xml.kproj | 16 +- .../MvcOptionsExtensions.cs | 2 + .../SerializableErrorWrapper.cs | 143 ++++++++++++++++++ src/Microsoft.AspNet.Mvc.Xml/project.json | 25 +++ .../ActionResults/ObjectResultTests.cs | 1 + .../ActionResults/SerializableErrorTests.cs | 56 +------ ...ataContractSerializerInputFormatterTest.cs | 21 +++ ...aContractSerializerOutputFormatterTests.cs | 2 +- .../XmlSerializerInputFormatterTests.cs | 21 +++ .../XmlSerializerOutputFormatterTests.cs | 3 +- .../JsonResultTest.cs | 1 + .../SerializableErrorWrapperTests.cs | 99 ++++++++++++ .../project.json | 1 + .../ActionResultTests.cs | 32 ---- .../ApiExplorerTest.cs | 3 +- .../SerializableErrorTests.cs | 68 +++++++++ .../XmlSerializerInputFormatterTests.cs | 10 +- .../project.json | 2 +- .../ActionConstraintsWebSite/project.json | 1 + .../Controllers/XmlSerializerController.cs | 1 + .../ActionResultsWebSite/project.json | 1 + test/WebSites/ApiExplorerWebSite/Startup.cs | 1 + test/WebSites/ApiExplorerWebSite/project.json | 1 + test/WebSites/ConnegWebSite/project.json | 1 + .../Filters/ModifyResultsFilterAttribute.cs | 1 + .../SerializationActionFilterAttribute.cs | 1 + test/WebSites/FiltersWebSite/project.json | 1 + .../DataContractSerializerController.cs | 1 + .../Controllers/XmlSerializerController.cs | 1 + test/WebSites/FormatterWebSite/project.json | 1 + .../WebSites/ModelBindingWebSite/project.json | 1 + .../VersioningWebSite/wwwroot/readme.md | Bin 236 -> 230 bytes .../Controllers/HomeController.cs | 2 +- .../SerializableErrorController.cs | 37 +++++ .../Models/DummyClass.cs | 2 +- test/WebSites/XmlFormattersWebSite/Startup.cs | 78 ++++++++++ .../XmlFormattersWebSite.kproj | 25 +++ .../project.json | 1 + .../wwwroot/readme.md | Bin 222 -> 222 bytes test/WebSites/XmlSerializerWebSite/Startup.cs | 41 ----- 52 files changed, 634 insertions(+), 235 deletions(-) rename src/{Microsoft.AspNet.Mvc.Core => Microsoft.AspNet.Mvc.Xml}/Formatters/FormattingUtilities.cs (94%) rename src/{Microsoft.AspNet.Mvc.Core => Microsoft.AspNet.Mvc.Xml}/Formatters/XmlDataContractSerializerInputFormatter.cs (92%) rename src/{Microsoft.AspNet.Mvc.Core => Microsoft.AspNet.Mvc.Xml}/Formatters/XmlDataContractSerializerOutputFormatter.cs (91%) rename src/{Microsoft.AspNet.Mvc.Core => Microsoft.AspNet.Mvc.Xml}/Formatters/XmlSerializerInputFormatter.cs (92%) rename src/{Microsoft.AspNet.Mvc.Core => Microsoft.AspNet.Mvc.Xml}/Formatters/XmlSerializerOutputFormatter.cs (91%) rename test/WebSites/XmlSerializerWebSite/XmlSerializerWebSite.kproj => src/Microsoft.AspNet.Mvc.Xml/Microsoft.AspNet.Mvc.Xml.kproj (51%) rename src/{Microsoft.AspNet.Mvc.Core => Microsoft.AspNet.Mvc.Xml}/MvcOptionsExtensions.cs (96%) create mode 100644 src/Microsoft.AspNet.Mvc.Xml/SerializableErrorWrapper.cs create mode 100644 src/Microsoft.AspNet.Mvc.Xml/project.json create mode 100644 test/Microsoft.AspNet.Mvc.Core.Test/SerializableErrorWrapperTests.cs create mode 100644 test/Microsoft.AspNet.Mvc.FunctionalTests/SerializableErrorTests.cs rename test/WebSites/{XmlSerializerWebSite => XmlFormattersWebSite}/Controllers/HomeController.cs (93%) create mode 100644 test/WebSites/XmlFormattersWebSite/Controllers/SerializableErrorController.cs rename test/WebSites/{XmlSerializerWebSite => XmlFormattersWebSite}/Models/DummyClass.cs (89%) create mode 100644 test/WebSites/XmlFormattersWebSite/Startup.cs create mode 100644 test/WebSites/XmlFormattersWebSite/XmlFormattersWebSite.kproj rename test/WebSites/{XmlSerializerWebSite => XmlFormattersWebSite}/project.json (93%) rename test/WebSites/{XmlSerializerWebSite => XmlFormattersWebSite}/wwwroot/readme.md (63%) delete mode 100644 test/WebSites/XmlSerializerWebSite/Startup.cs diff --git a/Mvc.sln b/Mvc.sln index 4ff2f92df8..d11ab11567 100644 --- a/Mvc.sln +++ b/Mvc.sln @@ -68,8 +68,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "AddServicesWebSite", "test\ EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "FiltersWebSite", "test\WebSites\FiltersWebSite\FiltersWebSite.kproj", "{1976AC4A-FEA4-4587-A158-D9F79736D2B6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "XmlSerializerWebSite", "test\WebSites\XmlSerializerWebSite\XmlSerializerWebSite.kproj", "{96107AC0-18E2-474D-BAB4-2FFF2185FBCD}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "UrlHelperWebSite", "test\WebSites\UrlHelperWebSite\UrlHelperWebSite.kproj", "{A192E504-2881-41DC-90D1-B7F1DD1134E8}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ApiExplorerWebSite", "test\WebSites\ApiExplorerWebSite\ApiExplorerWebSite.kproj", "{61061528-071E-424E-965A-07BCC2F02672}" @@ -114,6 +112,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ActionResultsWebSite", "tes EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "LoggingWebSite", "test\WebSites\LoggingWebSite\LoggingWebSite.kproj", "{0AD78AB5-D67C-49BC-81B1-0C51BFA82B5E}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Mvc.Xml", "src\Microsoft.AspNet.Mvc.Xml\Microsoft.AspNet.Mvc.Xml.kproj", "{9C632DF0-DC06-410B-95AE-B5423702E84F}" +EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ErrorPageMiddlewareWebSite", "test\WebSites\ErrorPageMiddlewareWebSite\ErrorPageMiddlewareWebSite.kproj", "{AD545A5B-2BA5-4314-88AC-FC2ACF2CC718}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ActionConstraintsWebSite", "test\WebSites\ActionConstraintsWebSite\ActionConstraintsWebSite.kproj", "{AF210F69-9D31-43AF-AC3A-CD366E252218}" @@ -124,6 +124,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResponseCacheWebSite", "tes EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Mvc.Common.Test", "test\Microsoft.AspNet.Mvc.Common.Test\Microsoft.AspNet.Mvc.Common.Test.kproj", "{0449D6D2-BE1B-4E29-8E1B-444420802C03}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "XmlFormattersWebSite", "test\WebSites\XmlFormattersWebSite\XmlFormattersWebSite.kproj", "{C3123A70-41C4-4122-AD1C-D35DF8958DD7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -394,16 +396,6 @@ Global {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1976AC4A-FEA4-4587-A158-D9F79736D2B6}.Release|x86.ActiveCfg = Release|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Debug|x86.ActiveCfg = Debug|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Release|Any CPU.Build.0 = Release|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD}.Release|x86.ActiveCfg = Release|Any CPU {A192E504-2881-41DC-90D1-B7F1DD1134E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A192E504-2881-41DC-90D1-B7F1DD1134E8}.Debug|Any CPU.Build.0 = Debug|Any CPU {A192E504-2881-41DC-90D1-B7F1DD1134E8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -636,6 +628,18 @@ Global {0AD78AB5-D67C-49BC-81B1-0C51BFA82B5E}.Release|Mixed Platforms.Build.0 = Release|Any CPU {0AD78AB5-D67C-49BC-81B1-0C51BFA82B5E}.Release|x86.ActiveCfg = Release|Any CPU {0AD78AB5-D67C-49BC-81B1-0C51BFA82B5E}.Release|x86.Build.0 = Release|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Debug|x86.Build.0 = Debug|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Release|Any CPU.Build.0 = Release|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Release|x86.ActiveCfg = Release|Any CPU + {9C632DF0-DC06-410B-95AE-B5423702E84F}.Release|x86.Build.0 = Release|Any CPU {AD545A5B-2BA5-4314-88AC-FC2ACF2CC718}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD545A5B-2BA5-4314-88AC-FC2ACF2CC718}.Debug|Any CPU.Build.0 = Debug|Any CPU {AD545A5B-2BA5-4314-88AC-FC2ACF2CC718}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -696,6 +700,18 @@ Global {0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|Mixed Platforms.Build.0 = Release|Any CPU {0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|x86.ActiveCfg = Release|Any CPU {0449D6D2-BE1B-4E29-8E1B-444420802C03}.Release|x86.Build.0 = Release|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Debug|x86.Build.0 = Debug|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Release|Any CPU.Build.0 = Release|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Release|x86.ActiveCfg = Release|Any CPU + {C3123A70-41C4-4122-AD1C-D35DF8958DD7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -728,7 +744,6 @@ Global {A353B17E-A940-4CE8-8BF9-179E24A9041F} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {6A0B65CE-6B01-40D0-840D-EFF3680D1547} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {1976AC4A-FEA4-4587-A158-D9F79736D2B6} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} - {96107AC0-18E2-474D-BAB4-2FFF2185FBCD} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {A192E504-2881-41DC-90D1-B7F1DD1134E8} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {61061528-071E-424E-965A-07BCC2F02672} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {C6304029-78C8-4604-99BE-2078DCA1DD36} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} @@ -751,10 +766,12 @@ Global {920F8A0E-6F7D-4BBE-84FF-840B89099BE6} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {0A6BB4C0-48D3-4E7F-952B-B8917345E075} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {0AD78AB5-D67C-49BC-81B1-0C51BFA82B5E} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} + {9C632DF0-DC06-410B-95AE-B5423702E84F} = {32285FA4-6B46-4D6B-A840-2B13E4C8B58E} {AD545A5B-2BA5-4314-88AC-FC2ACF2CC718} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {AF210F69-9D31-43AF-AC3A-CD366E252218} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {364EC3C6-C9DB-45E0-A0F2-1EE61E4B429B} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {BDEEBE09-C0C4-433C-B0B8-8478C9776996} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} {0449D6D2-BE1B-4E29-8E1B-444420802C03} = {3BA657BF-28B1-42DA-B5B0-1C4601FCF7B1} + {C3123A70-41C4-4122-AD1C-D35DF8958DD7} = {16703B76-C9F7-4C75-AE6C-53D92E308E3C} EndGlobalSection EndGlobal diff --git a/samples/MvcSample.Web/project.json b/samples/MvcSample.Web/project.json index 27b9b4f9dd..2e08841704 100644 --- a/samples/MvcSample.Web/project.json +++ b/samples/MvcSample.Web/project.json @@ -9,6 +9,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-*", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/samples/TagHelperSample.Web/project.json b/samples/TagHelperSample.Web/project.json index 3b21486dec..e948f65092 100644 --- a/samples/TagHelperSample.Web/project.json +++ b/samples/TagHelperSample.Web/project.json @@ -9,6 +9,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-*", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Mvc.Core/ActionResults/SerializableError.cs b/src/Microsoft.AspNet.Mvc.Core/ActionResults/SerializableError.cs index eb37279893..09dbf3e7cc 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ActionResults/SerializableError.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ActionResults/SerializableError.cs @@ -4,9 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Xml; -using System.Xml.Schema; -using System.Xml.Serialization; using Microsoft.AspNet.Mvc.Core; using Microsoft.AspNet.Mvc.ModelBinding; @@ -16,8 +13,7 @@ namespace Microsoft.AspNet.Mvc /// Defines a serializable container for storing ModelState information. /// This information is stored as key/value pairs. /// - [XmlRoot("Error")] - public sealed class SerializableError : Dictionary, IXmlSerializable + public sealed class SerializableError : Dictionary { /// /// Initializes a new instance of the class. @@ -55,50 +51,5 @@ namespace Microsoft.AspNet.Mvc } } } - - // - public XmlSchema GetSchema() - { - return null; - } - - // - public void ReadXml(XmlReader reader) - { - if (reader.IsEmptyElement) - { - reader.Read(); - return; - } - - reader.ReadStartElement(); - while (reader.NodeType != XmlNodeType.EndElement) - { - var key = XmlConvert.DecodeName(reader.LocalName); - var value = reader.ReadInnerXml(); - - Add(key, value); - reader.MoveToContent(); - } - - reader.ReadEndElement(); - } - - // - public void WriteXml(XmlWriter writer) - { - foreach (var keyValuePair in this) - { - var key = keyValuePair.Key; - var value = keyValuePair.Value; - writer.WriteStartElement(XmlConvert.EncodeLocalName(key)); - if (value != null) - { - writer.WriteValue(value); - } - - writer.WriteEndElement(); - } - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.ModelBinding/project.json b/src/Microsoft.AspNet.Mvc.ModelBinding/project.json index 0e5d48452a..afa5fd79b1 100644 --- a/src/Microsoft.AspNet.Mvc.ModelBinding/project.json +++ b/src/Microsoft.AspNet.Mvc.ModelBinding/project.json @@ -16,7 +16,6 @@ "aspnet50": { "frameworkAssemblies": { "System.ComponentModel.DataAnnotations": "", - "System.Xml": "", "System.Runtime.Serialization": "" } }, @@ -26,9 +25,7 @@ "System.ComponentModel.Annotations": "4.0.10-beta-*", "System.ComponentModel.TypeConverter": "4.0.0-beta-*", "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime.Serialization.Primitives": "4.0.0-beta-*", - "System.Runtime.Serialization.Xml": "4.0.10-beta-*", - "System.Xml.XmlSerializer": "4.0.10-beta-*" + "System.Runtime.Serialization.Primitives": "4.0.0-beta-*" } } } diff --git a/src/Microsoft.AspNet.Mvc.WebApiCompatShim/Microsoft.AspNet.Mvc.WebApiCompatShim.kproj b/src/Microsoft.AspNet.Mvc.WebApiCompatShim/Microsoft.AspNet.Mvc.WebApiCompatShim.kproj index 4b5f1c4085..0825001b2c 100644 --- a/src/Microsoft.AspNet.Mvc.WebApiCompatShim/Microsoft.AspNet.Mvc.WebApiCompatShim.kproj +++ b/src/Microsoft.AspNet.Mvc.WebApiCompatShim/Microsoft.AspNet.Mvc.WebApiCompatShim.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.WebApiCompatShim/project.json b/src/Microsoft.AspNet.Mvc.WebApiCompatShim/project.json index be28e68044..5b948090b5 100644 --- a/src/Microsoft.AspNet.Mvc.WebApiCompatShim/project.json +++ b/src/Microsoft.AspNet.Mvc.WebApiCompatShim/project.json @@ -13,12 +13,16 @@ "frameworks": { "aspnet50": { "frameworkAssemblies": { - "System.Net.Http": "4.0.0.0" + "System.Net.Http": "", + "System.Xml": "", + "System.Runtime.Serialization": "" } }, "aspnetcore50": { "dependencies": { - "System.Net.Http": "4.0.0-beta-*" + "System.Net.Http": "4.0.0-beta-*", + "System.Xml.XmlSerializer": "4.0.0-beta-*", + "System.Runtime.Serialization.Xml": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Mvc.Core/Formatters/FormattingUtilities.cs b/src/Microsoft.AspNet.Mvc.Xml/Formatters/FormattingUtilities.cs similarity index 94% rename from src/Microsoft.AspNet.Mvc.Core/Formatters/FormattingUtilities.cs rename to src/Microsoft.AspNet.Mvc.Xml/Formatters/FormattingUtilities.cs index 9bd88e22c7..998147e096 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Formatters/FormattingUtilities.cs +++ b/src/Microsoft.AspNet.Mvc.Xml/Formatters/FormattingUtilities.cs @@ -6,10 +6,10 @@ using System.Runtime.Serialization; #endif using System.Xml; -namespace Microsoft.AspNet.Mvc +namespace Microsoft.AspNet.Mvc.Xml { /// - /// Contains methods which are used by input formatters. + /// Contains methods which are used by Xml input formatters. /// public static class FormattingUtilities { diff --git a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlDataContractSerializerInputFormatter.cs b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlDataContractSerializerInputFormatter.cs similarity index 92% rename from src/Microsoft.AspNet.Mvc.Core/Formatters/XmlDataContractSerializerInputFormatter.cs rename to src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlDataContractSerializerInputFormatter.cs index 7ad091c5e5..e725bed1c6 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlDataContractSerializerInputFormatter.cs +++ b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlDataContractSerializerInputFormatter.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; using System.Xml; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Mvc +namespace Microsoft.AspNet.Mvc.Xml { /// /// This class handles deserialization of input XML data @@ -106,7 +106,7 @@ namespace Microsoft.AspNet.Mvc /// The used during deserialization. protected virtual XmlObjectSerializer CreateDataContractSerializer(Type type) { - return new DataContractSerializer(type); + return new DataContractSerializer(SerializableErrorWrapper.CreateSerializableType(type)); } private object GetDefaultValueForType(Type modelType) @@ -127,7 +127,9 @@ namespace Microsoft.AspNet.Mvc using (var xmlReader = CreateXmlReader(new DelegatingStream(request.Body))) { var xmlSerializer = CreateDataContractSerializer(type); - return Task.FromResult(xmlSerializer.ReadObject(xmlReader)); + var deserializedObject = xmlSerializer.ReadObject(xmlReader); + deserializedObject = SerializableErrorWrapper.UnwrapSerializableErrorObject(type, deserializedObject); + return Task.FromResult(deserializedObject); } } } diff --git a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlDataContractSerializerOutputFormatter.cs b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlDataContractSerializerOutputFormatter.cs similarity index 91% rename from src/Microsoft.AspNet.Mvc.Core/Formatters/XmlDataContractSerializerOutputFormatter.cs rename to src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlDataContractSerializerOutputFormatter.cs index 92a25916f9..e132106133 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlDataContractSerializerOutputFormatter.cs +++ b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlDataContractSerializerOutputFormatter.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using System.Xml; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Mvc +namespace Microsoft.AspNet.Mvc.Xml { /// /// This class handles serialization of objects @@ -53,16 +53,16 @@ namespace Microsoft.AspNet.Mvc /// The type of the object to be serialized. protected virtual Type GetSerializableType(Type declaredType, Type runtimeType) { - if (declaredType == null || - declaredType == typeof(object)) + Type type = declaredType; + if (declaredType == null || declaredType == typeof(object)) { if (runtimeType != null) { - return runtimeType; + type = runtimeType; } } - return declaredType; + return SerializableErrorWrapper.CreateSerializableType(type); } /// @@ -121,7 +121,8 @@ namespace Microsoft.AspNet.Mvc var type = GetSerializableType(context.DeclaredType, runtimeType); var dataContractSerializer = CreateSerializer(type); - dataContractSerializer.WriteObject(xmlWriter, context.Object); + var responseObject = SerializableErrorWrapper.WrapSerializableErrorObject(context.Object); + dataContractSerializer.WriteObject(xmlWriter, responseObject); } return Task.FromResult(true); diff --git a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlSerializerInputFormatter.cs b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlSerializerInputFormatter.cs similarity index 92% rename from src/Microsoft.AspNet.Mvc.Core/Formatters/XmlSerializerInputFormatter.cs rename to src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlSerializerInputFormatter.cs index 278d4e5e8f..4bce11b677 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlSerializerInputFormatter.cs +++ b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlSerializerInputFormatter.cs @@ -12,7 +12,7 @@ using System.Xml; using System.Xml.Serialization; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Mvc +namespace Microsoft.AspNet.Mvc.Xml { /// /// This class handles deserialization of input XML data @@ -106,7 +106,7 @@ namespace Microsoft.AspNet.Mvc /// The used during deserialization. protected virtual XmlSerializer CreateXmlSerializer(Type type) { - return new XmlSerializer(type); + return new XmlSerializer(SerializableErrorWrapper.CreateSerializableType(type)); } private object GetDefaultValueForType(Type modelType) @@ -127,7 +127,9 @@ namespace Microsoft.AspNet.Mvc using (var xmlReader = CreateXmlReader(new DelegatingStream(request.Body))) { var xmlSerializer = CreateXmlSerializer(type); - return Task.FromResult(xmlSerializer.Deserialize(xmlReader)); + var deserializedObject = xmlSerializer.Deserialize(xmlReader); + deserializedObject = SerializableErrorWrapper.UnwrapSerializableErrorObject(type, deserializedObject); + return Task.FromResult(deserializedObject); } } } diff --git a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlSerializerOutputFormatter.cs b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlSerializerOutputFormatter.cs similarity index 91% rename from src/Microsoft.AspNet.Mvc.Core/Formatters/XmlSerializerOutputFormatter.cs rename to src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlSerializerOutputFormatter.cs index a2572a26a7..b96dff87e3 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Formatters/XmlSerializerOutputFormatter.cs +++ b/src/Microsoft.AspNet.Mvc.Xml/Formatters/XmlSerializerOutputFormatter.cs @@ -8,7 +8,7 @@ using System.Xml; using System.Xml.Serialization; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Mvc +namespace Microsoft.AspNet.Mvc.Xml { /// /// This class handles serialization of objects @@ -53,16 +53,16 @@ namespace Microsoft.AspNet.Mvc /// The type of the object to be serialized. protected virtual Type GetSerializableType(Type declaredType, Type runtimeType) { - if (declaredType == null || - declaredType == typeof(object)) + var type = declaredType; + if (declaredType == null || declaredType == typeof(object)) { if (runtimeType != null) { - return runtimeType; + type = runtimeType; } } - return declaredType; + return SerializableErrorWrapper.CreateSerializableType(type); } /// @@ -119,7 +119,8 @@ namespace Microsoft.AspNet.Mvc var type = GetSerializableType(context.DeclaredType, runtimeType); var xmlSerializer = CreateSerializer(type); - xmlSerializer.Serialize(xmlWriter, context.Object); + var responseObject = SerializableErrorWrapper.WrapSerializableErrorObject(context.Object); + xmlSerializer.Serialize(xmlWriter, responseObject); } return Task.FromResult(true); diff --git a/test/WebSites/XmlSerializerWebSite/XmlSerializerWebSite.kproj b/src/Microsoft.AspNet.Mvc.Xml/Microsoft.AspNet.Mvc.Xml.kproj similarity index 51% rename from test/WebSites/XmlSerializerWebSite/XmlSerializerWebSite.kproj rename to src/Microsoft.AspNet.Mvc.Xml/Microsoft.AspNet.Mvc.Xml.kproj index 520ceb278b..8f5d8ba80c 100644 --- a/test/WebSites/XmlSerializerWebSite/XmlSerializerWebSite.kproj +++ b/src/Microsoft.AspNet.Mvc.Xml/Microsoft.AspNet.Mvc.Xml.kproj @@ -1,18 +1,24 @@  - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - 96107ac0-18e2-474d-bab4-2fff2185fbcd - ..\..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\..\artifacts\bin\$(MSBuildProjectName)\ + 9c632df0-dc06-410b-95ae-b5423702e84f + + + + 2.0 - 49642 + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Core/MvcOptionsExtensions.cs b/src/Microsoft.AspNet.Mvc.Xml/MvcOptionsExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Mvc.Core/MvcOptionsExtensions.cs rename to src/Microsoft.AspNet.Mvc.Xml/MvcOptionsExtensions.cs index 03e94f8701..289eed3909 100644 --- a/src/Microsoft.AspNet.Mvc.Core/MvcOptionsExtensions.cs +++ b/src/Microsoft.AspNet.Mvc.Xml/MvcOptionsExtensions.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.AspNet.Mvc.Xml; + namespace Microsoft.AspNet.Mvc { public static class MvcOptionsExtensions diff --git a/src/Microsoft.AspNet.Mvc.Xml/SerializableErrorWrapper.cs b/src/Microsoft.AspNet.Mvc.Xml/SerializableErrorWrapper.cs new file mode 100644 index 0000000000..f25addfc21 --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.Xml/SerializableErrorWrapper.cs @@ -0,0 +1,143 @@ +using System; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; + +namespace Microsoft.AspNet.Mvc.Xml +{ + /// + /// Wrapper class for to enable it to be serialized by the xml formatters. + /// + [XmlRoot("Error")] + public sealed class SerializableErrorWrapper : IXmlSerializable + { + // Note: XmlSerializer requires to have default constructor + public SerializableErrorWrapper() + { + SerializableError = new SerializableError(); + } + + /// + /// Initializes a new instance of the class. + /// + /// The object that needs to be wrapped. + public SerializableErrorWrapper([NotNull] SerializableError error) + { + SerializableError = error; + } + + /// + /// Gets the wrapped object which is serialized/deserialized into XML + /// representation. + /// + public SerializableError SerializableError { get; } + + /// + public XmlSchema GetSchema() + { + return null; + } + + /// + /// Generates a object from its XML representation. + /// + /// The stream from which the object is deserialized. + public void ReadXml(XmlReader reader) + { + if (reader.IsEmptyElement) + { + reader.Read(); + return; + } + + reader.ReadStartElement(); + while (reader.NodeType != XmlNodeType.EndElement) + { + var key = XmlConvert.DecodeName(reader.LocalName); + var value = reader.ReadInnerXml(); + + SerializableError.Add(key, value); + reader.MoveToContent(); + } + + reader.ReadEndElement(); + } + + /// + /// Converts the wrapped object into its XML representation. + /// + /// The stream to which the object is serialized. + public void WriteXml(XmlWriter writer) + { + foreach (var keyValuePair in SerializableError) + { + var key = keyValuePair.Key; + var value = keyValuePair.Value; + writer.WriteStartElement(XmlConvert.EncodeLocalName(key)); + if (value != null) + { + writer.WriteValue(value); + } + + writer.WriteEndElement(); + } + } + + /// + /// Gets the + /// + /// + /// + /// + public static object UnwrapSerializableErrorObject([NotNull] Type modelType, object deserializedObject) + { + // Since we expect users to typically bind with SerializableError type, + // we should try to unwrap and get the actual SerializableError. + if (modelType == typeof(SerializableError)) + { + var serializableErrorWrapper = deserializedObject as SerializableErrorWrapper; + if (serializableErrorWrapper != null) + { + deserializedObject = serializableErrorWrapper.SerializableError; + } + } + + return deserializedObject; + } + + /// + /// Checks if an object is an instance of type and if yes, + /// gets and returns the wrapped object in it. + /// + /// An + /// + public static object WrapSerializableErrorObject(object obj) + { + var serializableError = obj as SerializableError; + if (serializableError == null) + { + return obj; + } + + return new SerializableErrorWrapper(serializableError); + } + + /// + /// Checks if the given type is of type and if yes, returns + /// the wrapper type . + /// + /// The type to be checked + /// type, else the original type. + public static Type CreateSerializableType([NotNull] Type type) + { + // Since the type "SerializableError" is not compatible + // with the xml serializers, we create a compatible wrapper type for serialization. + if (type == typeof(SerializableError)) + { + type = typeof(SerializableErrorWrapper); + } + + return type; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Mvc.Xml/project.json b/src/Microsoft.AspNet.Mvc.Xml/project.json new file mode 100644 index 0000000000..0019045648 --- /dev/null +++ b/src/Microsoft.AspNet.Mvc.Xml/project.json @@ -0,0 +1,25 @@ +{ + "description": "Contains DataContractSerializer and XmlSerializer based input and output formatters", + "version": "6.0.0-*", + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.AspNet.Mvc.Common": { "version": "6.0.0-*", "type": "build" }, + "Microsoft.AspNet.Mvc.Core": "6.0.0-*" + }, + "frameworks": { + "aspnet50": { + "frameworkAssemblies": { + "System.Xml": "", + "System.Runtime.Serialization": "" + } + }, + "aspnetcore50": { + "dependencies": { + "System.Runtime.Serialization.Xml": "4.0.10-beta-*", + "System.Xml.XmlSerializer": "4.0.10-beta-*" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/ObjectResultTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/ObjectResultTests.cs index f89b9231f3..3caa8403df 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/ObjectResultTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/ObjectResultTests.cs @@ -9,6 +9,7 @@ using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core; +using Microsoft.AspNet.Mvc.Xml; using Microsoft.AspNet.Routing; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/SerializableErrorTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/SerializableErrorTests.cs index 67f59c6518..e309bcc21c 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/SerializableErrorTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/SerializableErrorTests.cs @@ -7,6 +7,7 @@ using System.Runtime.Serialization; using System.Text; using System.Xml; using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.Xml; using Xunit; namespace Microsoft.AspNet.Mvc @@ -87,60 +88,5 @@ namespace Microsoft.AspNet.Mvc // Assert Assert.Equal(0, serializableError.Count); } - - [Fact] - public void GetSchema_Returns_Null() - { - // Arrange - var modelState = new ModelStateDictionary(); - // To make modelState invalid. - modelState.AddModelError("key1", "Test Error 1"); - var serializableError = new SerializableError(modelState); - - // Act & Assert - Assert.Null(serializableError.GetSchema()); - } - - [Fact] - public void WriteXml_WritesValidXml() - { - // Arrange - var modelState = new ModelStateDictionary(); - modelState.AddModelError("key1", "Test Error 1"); - modelState.AddModelError("key1", "Test Error 2"); - modelState.AddModelError("key2", "Test Error 3"); - var serializableError = new SerializableError(modelState); - var outputStream = new MemoryStream(); - - // Act - using (var xmlWriter = XmlWriter.Create(outputStream)) - { - var dataContractSerializer = new DataContractSerializer(typeof(SerializableError)); - dataContractSerializer.WriteObject(xmlWriter, serializableError); - } - outputStream.Position = 0; - var res = new StreamReader(outputStream, Encoding.UTF8).ReadToEnd(); - - // Assert - Assert.Equal("" + - "Test Error 1 Test Error 2Test Error 3", res); - } - - [Fact] - public void ReadXml_ReadsSerializableErrorXml() - { - // Arrange - var serializableErrorXml = "" + - "Test Error 1 Test Error 2Test Error 3"; - var serializer = new DataContractSerializer(typeof(SerializableError)); - - // Act - var errors = (SerializableError)serializer.ReadObject( - new MemoryStream(Encoding.UTF8.GetBytes(serializableErrorXml))); - - // Assert - Assert.Equal("Test Error 1 Test Error 2", errors["key1"]); - Assert.Equal("Test Error 3", errors["key2"]); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerInputFormatterTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerInputFormatterTest.cs index 1869a47cb8..d67cf74186 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerInputFormatterTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerInputFormatterTest.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using System.Xml; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.Xml; using Microsoft.AspNet.Testing; using Moq; using Xunit; @@ -338,6 +339,26 @@ namespace Microsoft.AspNet.Mvc Assert.Equal(expectedString, levelOneModel.sampleString); } + [Fact] + public async Task ReadsSerializableErrorXml() + { + // Arrange + var serializableErrorXml = "" + + "Test Error 1 Test Error 2Test Error 3"; + var formatter = new XmlDataContractSerializerInputFormatter(); + var contentBytes = Encodings.UTF8EncodingWithoutBOM.GetBytes(serializableErrorXml); + var context = GetInputFormatterContext(contentBytes, typeof(SerializableError)); + + // Act + var model = await formatter.ReadAsync(context); + + // Assert + var serializableError = model as SerializableError; + Assert.NotNull(serializableError); + Assert.Equal("Test Error 1 Test Error 2", serializableError["key1"]); + Assert.Equal("Test Error 3", serializableError["key2"]); + } + private InputFormatterContext GetInputFormatterContext(byte[] contentBytes, Type modelType) { var actionContext = GetActionContext(contentBytes); diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerOutputFormatterTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerOutputFormatterTests.cs index bf61734604..ffdeb14418 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerOutputFormatterTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlDataContractSerializerOutputFormatterTests.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.Net.Http.Headers; +using Microsoft.AspNet.Mvc.Xml; using Moq; using Xunit; @@ -273,7 +274,6 @@ namespace Microsoft.AspNet.Mvc.Core // Act & Assert await formatter.WriteAsync(outputFormatterContext); } - public static IEnumerable TypesForCanWriteResult { get diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerInputFormatterTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerInputFormatterTests.cs index 597c5576d4..e6f3189277 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerInputFormatterTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerInputFormatterTests.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using System.Xml; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.Xml; using Microsoft.AspNet.Testing; using Moq; using Xunit; @@ -345,6 +346,26 @@ namespace Microsoft.AspNet.Mvc Assert.Equal(XmlConvert.ToDateTime(expectedDateTime, XmlDateTimeSerializationMode.Utc), levelOneModel.SampleDate); } + [Fact] + public async Task ReadsSerializableErrorXml() + { + // Arrange + var serializableErrorXml = "" + + "Test Error 1 Test Error 2Test Error 3"; + var formatter = new XmlSerializerInputFormatter(); + var contentBytes = Encodings.UTF8EncodingWithoutBOM.GetBytes(serializableErrorXml); + var context = GetInputFormatterContext(contentBytes, typeof(SerializableError)); + + // Act + var model = await formatter.ReadAsync(context); + + // Assert + var serializableError = model as SerializableError; + Assert.NotNull(serializableError); + Assert.Equal("Test Error 1 Test Error 2", serializableError["key1"]); + Assert.Equal("Test Error 3", serializableError["key2"]); + } + private InputFormatterContext GetInputFormatterContext(byte[] contentBytes, Type modelType) { var actionContext = GetActionContext(contentBytes); diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerOutputFormatterTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerOutputFormatterTests.cs index 37fdeed886..633c3c8bda 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerOutputFormatterTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Formatters/XmlSerializerOutputFormatterTests.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.Net.Http.Headers; +using Microsoft.AspNet.Mvc.Xml; using Moq; using Xunit; @@ -242,7 +243,7 @@ namespace Microsoft.AspNet.Mvc.Core Assert.NotNull(outputFormatterContext.ActionContext.HttpContext.Response.Body); Assert.True(outputFormatterContext.ActionContext.HttpContext.Response.Body.CanRead); } - + public static IEnumerable TypesForCanWriteResult { get diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/JsonResultTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/JsonResultTest.cs index 509cbe8ff3..f0254eb1a7 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/JsonResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/JsonResultTest.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Mvc.Xml; using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.Routing; using Microsoft.Framework.OptionsModel; diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/SerializableErrorWrapperTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/SerializableErrorWrapperTests.cs new file mode 100644 index 0000000000..5d951d5135 --- /dev/null +++ b/test/Microsoft.AspNet.Mvc.Core.Test/SerializableErrorWrapperTests.cs @@ -0,0 +1,99 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Globalization; +using System.IO; +using System.Runtime.Serialization; +using System.Text; +using System.Xml; +using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.Xml; +using Xunit; + +namespace Microsoft.AspNet.Mvc +{ + public class SerializableErrorWrapperTests + { + [Fact] + public void DefaultConstructor_CreatesSerializableError() + { + // Arrange and Act + var wrapper = new SerializableErrorWrapper(); + + // Assert + Assert.NotNull(wrapper.SerializableError); + Assert.Empty(wrapper.SerializableError); + } + + [Fact] + public void WrappedSerializableErrorInstance_ReturnedFromProperty() + { + // Arrange + var serializableError = new SerializableError(); + serializableError.Add("key1", "key1-error"); + + // Act + var wrapper = new SerializableErrorWrapper(serializableError); + + // Assert + Assert.NotNull(wrapper.SerializableError); + Assert.Same(serializableError, wrapper.SerializableError); + Assert.Equal(1, wrapper.SerializableError.Count); + Assert.True(wrapper.SerializableError.ContainsKey("key1")); + Assert.Equal("key1-error", wrapper.SerializableError["key1"]); + } + + [Fact] + public void GetSchema_Returns_Null() + { + // Arrange + var serializableError = new SerializableErrorWrapper(new SerializableError(new ModelStateDictionary())); + + // Act & Assert + Assert.Null(serializableError.GetSchema()); + } + + [Fact] + public void ReadXml_ReadsSerializableErrorXml() + { + // Arrange + var serializableErrorXml = "" + + "Test Error 1 Test Error 2Test Error 3"; + var serializer = new DataContractSerializer(typeof(SerializableErrorWrapper)); + + // Act + var wrapper = (SerializableErrorWrapper)serializer.ReadObject( + new MemoryStream(Encoding.UTF8.GetBytes(serializableErrorXml))); + var errors = wrapper.SerializableError; + + // Assert + Assert.Equal("Test Error 1 Test Error 2", errors["key1"]); + Assert.Equal("Test Error 3", errors["key2"]); + } + + [Fact] + public void WriteXml_WritesValidXml() + { + // Arrange + var modelState = new ModelStateDictionary(); + modelState.AddModelError("key1", "Test Error 1"); + modelState.AddModelError("key1", "Test Error 2"); + modelState.AddModelError("key2", "Test Error 3"); + var serializableError = new SerializableError(modelState); + var outputStream = new MemoryStream(); + + // Act + using (var xmlWriter = XmlWriter.Create(outputStream)) + { + var dataContractSerializer = new DataContractSerializer(typeof(SerializableErrorWrapper)); + dataContractSerializer.WriteObject(xmlWriter, new SerializableErrorWrapper(serializableError)); + } + outputStream.Position = 0; + var res = new StreamReader(outputStream, Encoding.UTF8).ReadToEnd(); + + // Assert + Assert.Equal("" + + "Test Error 1 Test Error 2Test Error 3", res); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/project.json b/test/Microsoft.AspNet.Mvc.Core.Test/project.json index 4df41d5459..ee49e13e66 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/project.json +++ b/test/Microsoft.AspNet.Mvc.Core.Test/project.json @@ -4,6 +4,7 @@ }, "dependencies": { "Microsoft.AspNet.Mvc" : "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml" : "6.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.kre": "1.0.0-*" diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ActionResultTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ActionResultTests.cs index 48e9b244c4..a34b9e4702 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ActionResultTests.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ActionResultTests.cs @@ -248,38 +248,6 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests await response.Content.ReadAsStringAsync()); } - [Fact] - public async Task SerializableError_ReadTheReturnedXml() - { - // Arrange - var server = TestServer.Create(_provider, _app); - var client = server.CreateClient(); - - var input = "" + - "" + - "20foo"; - - var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/Home/Index"); - request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/xml;charset=utf-8")); - request.Content = new StringContent(input, Encoding.UTF8, "application/xml"); - - // Act - var response = await client.SendAsync(request); - var responseContent = await response.Content.ReadAsStringAsync(); - - // Deserializing Xml content - var serializer = new XmlSerializer(typeof(SerializableError)); - var errors = (SerializableError)serializer.Deserialize( - new MemoryStream(Encoding.UTF8.GetBytes(responseContent))); - - // Assert - Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - Assert.Equal( - "" + sampleStringError + "", - responseContent); - Assert.Equal(sampleStringError, errors["test.SampleString"]); - } - [Fact] public async Task ContentResult_WritesContent_SetsDefaultContentTypeAndEncoding() { diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ApiExplorerTest.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ApiExplorerTest.cs index 0e92daea96..846b9eb558 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ApiExplorerTest.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ApiExplorerTest.cs @@ -7,6 +7,7 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Mvc.Description; +using Microsoft.AspNet.Mvc.Xml; using Microsoft.AspNet.TestHost; using Newtonsoft.Json; using Xunit; @@ -697,7 +698,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests } [Theory] - [InlineData("Controller", "text/xml", "Microsoft.AspNet.Mvc.XmlDataContractSerializerOutputFormatter")] + [InlineData("Controller", "text/xml", "Microsoft.AspNet.Mvc.Xml.XmlDataContractSerializerOutputFormatter")] [InlineData("Action", "application/json", "Microsoft.AspNet.Mvc.JsonOutputFormatter")] public async Task ApiExplorer_ResponseContentType_OverrideOnAction( string action, diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/SerializableErrorTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/SerializableErrorTests.cs new file mode 100644 index 0000000000..0111208e7f --- /dev/null +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/SerializableErrorTests.cs @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.TestHost; +using Xunit; + +namespace Microsoft.AspNet.Mvc.FunctionalTests +{ + public class SerializableErrorTests + { + private readonly IServiceProvider _services = TestHelper.CreateServices(nameof(XmlFormattersWebSite)); + private readonly Action _app = new XmlFormattersWebSite.Startup().Configure; + + [Theory] + [InlineData("application/xml-xmlser")] + [InlineData("application/xml-dcs")] + public async Task ModelStateErrors_AreSerialized(string acceptHeader) + { + // Arrange + var server = TestServer.Create(_services, _app); + var client = server.CreateClient(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(acceptHeader)); + var expectedXml = "key1-errorThe input was not valid."; + + // Act + var response = await client.GetAsync("http://localhost/SerializableError/ModelStateErrors"); + + //Assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.NotNull(response.Content.Headers.ContentType); + Assert.Equal(acceptHeader, response.Content.Headers.ContentType.MediaType); + var responseData = await response.Content.ReadAsStringAsync(); + Assert.Equal(expectedXml, responseData); + } + + [Theory] + [InlineData("application/xml-xmlser")] + [InlineData("application/xml-dcs")] + public async Task PostedSerializableError_IsBound(string acceptHeader) + { + // Arrange + var server = TestServer.Create(_services, _app); + var client = server.CreateClient(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(acceptHeader)); + var expectedXml = "key1-errorThe input was not valid."; + var requestContent = new StringContent(expectedXml, Encoding.UTF8, acceptHeader); + + // Act + var response = await client.PostAsync("http://localhost/SerializableError/LogErrors", requestContent); + + // Assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotNull(response.Content); + Assert.NotNull(response.Content.Headers.ContentType); + Assert.Equal(acceptHeader, response.Content.Headers.ContentType.MediaType); + var responseData = await response.Content.ReadAsStringAsync(); + Assert.Equal(expectedXml, responseData); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/XmlSerializerInputFormatterTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/XmlSerializerInputFormatterTests.cs index d4d48c6177..b8e2e387f3 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/XmlSerializerInputFormatterTests.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/XmlSerializerInputFormatterTests.cs @@ -14,8 +14,8 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests { public class XmlSerializerInputFormatterTests { - private readonly IServiceProvider _services = TestHelper.CreateServices("XmlSerializerWebSite"); - private readonly Action _app = new XmlSerializerWebSite.Startup().Configure; + private readonly IServiceProvider _services = TestHelper.CreateServices(nameof(XmlFormattersWebSite)); + private readonly Action _app = new XmlFormattersWebSite.Startup().Configure; [Fact] public async Task CheckIfXmlSerializerInputFormatterIsCalled() @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests var input = "" + "" + sampleInputInt.ToString() + ""; - var content = new StringContent(input, Encoding.UTF8, "application/xml"); + var content = new StringContent(input, Encoding.UTF8, "application/xml-xmlser"); // Act var response = await client.PostAsync("http://localhost/Home/Index", content); @@ -46,9 +46,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests var sampleInputInt = 10; var input = "" + "" + + "i:type=\"DerivedDummyClass\" xmlns=\"http://schemas.datacontract.org/2004/07/XmlFormattersWebSite\">" + "" + sampleInputInt.ToString() + ""; - var content = new StringContent(input, Encoding.UTF8, "application/xml"); + var content = new StringContent(input, Encoding.UTF8, "application/xml-xmlser"); // Act var response = await client.PostAsync("http://localhost/Home/Index", content); diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/project.json b/test/Microsoft.AspNet.Mvc.FunctionalTests/project.json index e29d0af3b5..3b3a5c5ee7 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/project.json +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/project.json @@ -35,7 +35,7 @@ "ValueProvidersWebSite": "1.0.0", "VersioningWebSite": "1.0.0", "ViewComponentWebSite": "1.0.0", - "XmlSerializerWebSite": "1.0.0", + "XmlFormattersWebSite": "1.0.0", "WebApiCompatShimWebSite": "1.0.0", "Microsoft.AspNet.TestHost": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", diff --git a/test/WebSites/ActionConstraintsWebSite/project.json b/test/WebSites/ActionConstraintsWebSite/project.json index 464f3bbc61..0b043ea88d 100644 --- a/test/WebSites/ActionConstraintsWebSite/project.json +++ b/test/WebSites/ActionConstraintsWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/ActionResultsWebSite/Controllers/XmlSerializerController.cs b/test/WebSites/ActionResultsWebSite/Controllers/XmlSerializerController.cs index fe500bb0ca..111bafc967 100644 --- a/test/WebSites/ActionResultsWebSite/Controllers/XmlSerializerController.cs +++ b/test/WebSites/ActionResultsWebSite/Controllers/XmlSerializerController.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; namespace ActionResultsWebSite { diff --git a/test/WebSites/ActionResultsWebSite/project.json b/test/WebSites/ActionResultsWebSite/project.json index 464f3bbc61..0b043ea88d 100644 --- a/test/WebSites/ActionResultsWebSite/project.json +++ b/test/WebSites/ActionResultsWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/ApiExplorerWebSite/Startup.cs b/test/WebSites/ApiExplorerWebSite/Startup.cs index 34b77d4717..c47e2bb058 100644 --- a/test/WebSites/ApiExplorerWebSite/Startup.cs +++ b/test/WebSites/ApiExplorerWebSite/Startup.cs @@ -3,6 +3,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; using Microsoft.AspNet.Routing; using Microsoft.Framework.DependencyInjection; diff --git a/test/WebSites/ApiExplorerWebSite/project.json b/test/WebSites/ApiExplorerWebSite/project.json index 6fbc582927..1469d1a1be 100644 --- a/test/WebSites/ApiExplorerWebSite/project.json +++ b/test/WebSites/ApiExplorerWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/ConnegWebSite/project.json b/test/WebSites/ConnegWebSite/project.json index c582a1382f..1066442200 100644 --- a/test/WebSites/ConnegWebSite/project.json +++ b/test/WebSites/ConnegWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs b/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs index 04323a7c5a..a143eb38f5 100644 --- a/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs +++ b/test/WebSites/FiltersWebSite/Filters/ModifyResultsFilterAttribute.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; namespace FiltersWebSite { diff --git a/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs b/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs index 5a3c67dbc9..4dae692525 100644 --- a/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs +++ b/test/WebSites/FiltersWebSite/Filters/SerializationActionFilterAttribute.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; namespace FiltersWebSite { diff --git a/test/WebSites/FiltersWebSite/project.json b/test/WebSites/FiltersWebSite/project.json index c582a1382f..1066442200 100644 --- a/test/WebSites/FiltersWebSite/project.json +++ b/test/WebSites/FiltersWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/FormatterWebSite/Controllers/DataContractSerializerController.cs b/test/WebSites/FormatterWebSite/Controllers/DataContractSerializerController.cs index 11b1c9ecc4..f354972ed8 100644 --- a/test/WebSites/FormatterWebSite/Controllers/DataContractSerializerController.cs +++ b/test/WebSites/FormatterWebSite/Controllers/DataContractSerializerController.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; namespace FormatterWebSite { diff --git a/test/WebSites/FormatterWebSite/Controllers/XmlSerializerController.cs b/test/WebSites/FormatterWebSite/Controllers/XmlSerializerController.cs index f2544ce6e0..93c5d0c088 100644 --- a/test/WebSites/FormatterWebSite/Controllers/XmlSerializerController.cs +++ b/test/WebSites/FormatterWebSite/Controllers/XmlSerializerController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; namespace FormatterWebSite { diff --git a/test/WebSites/FormatterWebSite/project.json b/test/WebSites/FormatterWebSite/project.json index 18ee633276..ad6eff5138 100644 --- a/test/WebSites/FormatterWebSite/project.json +++ b/test/WebSites/FormatterWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/ModelBindingWebSite/project.json b/test/WebSites/ModelBindingWebSite/project.json index c582a1382f..1066442200 100644 --- a/test/WebSites/ModelBindingWebSite/project.json +++ b/test/WebSites/ModelBindingWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/VersioningWebSite/wwwroot/readme.md b/test/WebSites/VersioningWebSite/wwwroot/readme.md index 2c727fc30834f0cbfd2962d95216632c364b4287..ecf6b78a4762a3f13051c3116e2d6543f0d10896 100644 GIT binary patch delta 29 jcmaFE_>58X|GzMXRE8pkVunnHe1<$Ana7YmQTiePoCFDo delta 35 ncmaFH_=ZvX|Gx-^T!tKmV1`tNB8E(cL?Anpp$f#CD0&e9(YOk) diff --git a/test/WebSites/XmlSerializerWebSite/Controllers/HomeController.cs b/test/WebSites/XmlFormattersWebSite/Controllers/HomeController.cs similarity index 93% rename from test/WebSites/XmlSerializerWebSite/Controllers/HomeController.cs rename to test/WebSites/XmlFormattersWebSite/Controllers/HomeController.cs index 2c1aa72be5..1652e561cb 100644 --- a/test/WebSites/XmlSerializerWebSite/Controllers/HomeController.cs +++ b/test/WebSites/XmlFormattersWebSite/Controllers/HomeController.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Mvc; -namespace XmlSerializerWebSite +namespace XmlFormattersWebSite { public class HomeController : Controller { diff --git a/test/WebSites/XmlFormattersWebSite/Controllers/SerializableErrorController.cs b/test/WebSites/XmlFormattersWebSite/Controllers/SerializableErrorController.cs new file mode 100644 index 0000000000..7cc7f24a31 --- /dev/null +++ b/test/WebSites/XmlFormattersWebSite/Controllers/SerializableErrorController.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Mvc; + +namespace XmlFormattersWebSite.Controllers +{ + public class SerializableErrorController : Controller + { + [HttpGet] + public IActionResult ModelStateErrors() + { + InvalidOperationException exception = null; + + try + { + throw new InvalidOperationException("Error in executing the action"); + } + catch (InvalidOperationException invalidOperationEx) + { + exception = invalidOperationEx; + } + + ModelState.AddModelError("key1", "key1-error"); + ModelState.AddModelError("key2", exception); + + return new ObjectResult(new SerializableError(ModelState)); + } + + [HttpPost] + public SerializableError LogErrors([FromBody] SerializableError serializableError) + { + return serializableError; + } + } +} diff --git a/test/WebSites/XmlSerializerWebSite/Models/DummyClass.cs b/test/WebSites/XmlFormattersWebSite/Models/DummyClass.cs similarity index 89% rename from test/WebSites/XmlSerializerWebSite/Models/DummyClass.cs rename to test/WebSites/XmlFormattersWebSite/Models/DummyClass.cs index a57cf1a601..356e2a6057 100644 --- a/test/WebSites/XmlSerializerWebSite/Models/DummyClass.cs +++ b/test/WebSites/XmlFormattersWebSite/Models/DummyClass.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace XmlSerializerWebSite +namespace XmlFormattersWebSite { public class DummyClass { diff --git a/test/WebSites/XmlFormattersWebSite/Startup.cs b/test/WebSites/XmlFormattersWebSite/Startup.cs new file mode 100644 index 0000000000..1f37168028 --- /dev/null +++ b/test/WebSites/XmlFormattersWebSite/Startup.cs @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Mvc; +using Microsoft.AspNet.Mvc.Xml; +using Microsoft.AspNet.Routing; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Net.Http.Headers; + +namespace XmlFormattersWebSite +{ + public class Startup + { + public void Configure(IApplicationBuilder app) + { + var configuration = app.GetTestConfiguration(); + + // Set up application services + app.UseServices(services => + { + // Add MVC services to the services container + services.AddMvc(configuration); + + services.Configure(options => + { + options.InputFormatters.Clear(); + options.OutputFormatters.Clear(); + + // Since both XmlSerializer and DataContractSerializer based formatters + // have supported media types of 'application/xml' and 'text/xml', it + // would be difficult for a test to choose a particular formatter based on + // request information (Ex: Accept header). + // So here we instead clear out the default supported media types and create new + // ones which are distinguishable between formatters. + var xmlSerializerInputFormatter = new XmlSerializerInputFormatter(); + xmlSerializerInputFormatter.SupportedMediaTypes.Clear(); + xmlSerializerInputFormatter.SupportedMediaTypes.Add( + new MediaTypeHeaderValue("application/xml-xmlser")); + xmlSerializerInputFormatter.SupportedMediaTypes.Add( + new MediaTypeHeaderValue("text/xml-xmlser")); + + var xmlSerializerOutputFormatter = new XmlSerializerOutputFormatter(); + xmlSerializerOutputFormatter.SupportedMediaTypes.Clear(); + xmlSerializerOutputFormatter.SupportedMediaTypes.Add( + new MediaTypeHeaderValue("application/xml-xmlser")); + xmlSerializerOutputFormatter.SupportedMediaTypes.Add( + new MediaTypeHeaderValue("text/xml-xmlser")); + + var dcsInputFormatter = new XmlDataContractSerializerInputFormatter(); + dcsInputFormatter.SupportedMediaTypes.Clear(); + dcsInputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml-dcs")); + dcsInputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml-dcs")); + + var dcsOutputFormatter = new XmlDataContractSerializerOutputFormatter(); + dcsOutputFormatter.SupportedMediaTypes.Clear(); + dcsOutputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml-dcs")); + dcsOutputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml-dcs")); + + options.InputFormatters.Add(dcsInputFormatter); + options.InputFormatters.Add(xmlSerializerInputFormatter); + options.OutputFormatters.Add(dcsOutputFormatter); + options.OutputFormatters.Add(xmlSerializerOutputFormatter); + }); + }); + + app.UseErrorReporter(); + + // Add MVC to the request pipeline + app.UseMvc(routes => + { + routes.MapRoute("ActionAsMethod", "{controller}/{action}", + defaults: new { controller = "Home", action = "Index" }); + + }); + } + } +} diff --git a/test/WebSites/XmlFormattersWebSite/XmlFormattersWebSite.kproj b/test/WebSites/XmlFormattersWebSite/XmlFormattersWebSite.kproj new file mode 100644 index 0000000000..3802cbcc0f --- /dev/null +++ b/test/WebSites/XmlFormattersWebSite/XmlFormattersWebSite.kproj @@ -0,0 +1,25 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + c3123a70-41c4-4122-ad1c-d35df8958dd7 + + + + + + + 2.0 + 46481 + + + + + + + + \ No newline at end of file diff --git a/test/WebSites/XmlSerializerWebSite/project.json b/test/WebSites/XmlFormattersWebSite/project.json similarity index 93% rename from test/WebSites/XmlSerializerWebSite/project.json rename to test/WebSites/XmlFormattersWebSite/project.json index c582a1382f..1066442200 100644 --- a/test/WebSites/XmlSerializerWebSite/project.json +++ b/test/WebSites/XmlFormattersWebSite/project.json @@ -6,6 +6,7 @@ "dependencies": { "Kestrel": "1.0.0-*", "Microsoft.AspNet.Mvc": "6.0.0-*", + "Microsoft.AspNet.Mvc.Xml": "6.0.0-*", "Microsoft.AspNet.Mvc.TestConfiguration": "1.0.0", "Microsoft.AspNet.Server.IIS": "1.0.0-*", "Microsoft.AspNet.Server.WebListener": "1.0.0-*", diff --git a/test/WebSites/XmlSerializerWebSite/wwwroot/readme.md b/test/WebSites/XmlFormattersWebSite/wwwroot/readme.md similarity index 63% rename from test/WebSites/XmlSerializerWebSite/wwwroot/readme.md rename to test/WebSites/XmlFormattersWebSite/wwwroot/readme.md index 1ce5883ae0a16f198546fb18f3e60f79c8615fc5..e73cbebdc560d789c4b2a02e1f8cc0c4fae09007 100644 GIT binary patch delta 35 mcmcb|c#l!~|Gx-^T!tJ5H->zMA|NY~p#%t1f$ZXm(uV=hG76pm delta 35 ncmcb|c#l!~|Gx-^T!tKmV1`tNB8E(cL?Anpp$f#CD18_J&d>^x diff --git a/test/WebSites/XmlSerializerWebSite/Startup.cs b/test/WebSites/XmlSerializerWebSite/Startup.cs deleted file mode 100644 index bd63f6cc0d..0000000000 --- a/test/WebSites/XmlSerializerWebSite/Startup.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Mvc; -using Microsoft.AspNet.Routing; -using Microsoft.Framework.DependencyInjection; - -namespace XmlSerializerWebSite -{ - public class Startup - { - public void Configure(IApplicationBuilder app) - { - var configuration = app.GetTestConfiguration(); - - // Set up application services - app.UseServices(services => - { - // Add MVC services to the services container - services.AddMvc(configuration); - - services.Configure(options => - { - options.InputFormatters.Clear(); - options.InputFormatters.Insert(0, new XmlSerializerInputFormatter()); - }); - }); - - app.UseErrorReporter(); - - // Add MVC to the request pipeline - app.UseMvc(routes => - { - routes.MapRoute("ActionAsMethod", "{controller}/{action}", - defaults: new { controller = "Home", action = "Index" }); - - }); - } - } -}