Skip to content

Commit 4968967

Browse files
committed
Controller configuration moves json formatter to after xml formatter
1 parent 782152c commit 4968967

1 file changed

Lines changed: 32 additions & 4 deletions

File tree

src/NuGet.Server.V2/OData/NuGetODataControllerConfigurationAttribute.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,50 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Linq;
56
using System.Web.Http.Controllers;
67
using System.Web.Http.OData.Formatter;
78
using System.Web.Http.OData.Formatter.Deserialization;
89
using NuGet.Server.V2.OData.Serializers;
10+
using System.Collections.Generic;
911

1012
namespace NuGet.Server.V2.OData
1113
{
1214
class NuGetODataControllerConfigurationAttribute : Attribute, IControllerConfiguration
1315
{
14-
public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
16+
private static IList<ODataMediaTypeFormatter> _formatters;
17+
private static object _syncLock = new object();
18+
19+
private IList<ODataMediaTypeFormatter> GetFormatters()
1520
{
16-
var serProvider = new CustomSerializerProvider(provider => new NuGetEntityTypeSerializer(provider));
17-
var formatters = ODataMediaTypeFormatters.Create(serProvider, new DefaultODataDeserializerProvider());
21+
if (_formatters == null)
22+
{
23+
lock (_syncLock)
24+
{
25+
if (_formatters == null)
26+
{
27+
var serProvider = new CustomSerializerProvider(provider => new NuGetEntityTypeSerializer(provider));
28+
var createdFormatters = ODataMediaTypeFormatters.Create(serProvider, new DefaultODataDeserializerProvider());
29+
30+
var jsonFormatters = createdFormatters.Where(x => x.SupportedMediaTypes.Any(y => y.MediaType.Contains("json")));
31+
createdFormatters.RemoveAll(x => jsonFormatters.Contains(x));
32+
var xmlFormatterIndex = createdFormatters.IndexOf(createdFormatters.Last(x => x.SupportedMediaTypes.Any(y => y.MediaType.Contains("xml"))));
33+
foreach(var formatter in jsonFormatters)
34+
{
35+
createdFormatters.Insert(xmlFormatterIndex++, formatter);
36+
}
37+
_formatters = createdFormatters;
38+
}
39+
}
40+
}
41+
return _formatters;
42+
}
1843

44+
45+
public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
46+
{
1947
controllerSettings.Formatters.Clear();
20-
controllerSettings.Formatters.InsertRange(0, formatters);
48+
controllerSettings.Formatters.InsertRange(0, GetFormatters());
2149
}
2250
}
2351
}

0 commit comments

Comments
 (0)