Skip to content

Commit 7266d6c

Browse files
Merge pull request #1146 from JonRobidus/develop
Fix: "A concurrent update was performed on this collection and corrupted its state."
2 parents 60625f2 + ca8eebd commit 7266d6c

13 files changed

+143
-98
lines changed

src/SoapCore.Tests/FaultExceptionTransformer/TestFaultExceptionTransformer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace SoapCore.Tests.FaultExceptionTransformer
99
{
1010
public class TestFaultExceptionTransformer : IFaultExceptionTransformer
1111
{
12-
public Message ProvideFault(Exception exception, MessageVersion messageVersion, Message requestMessage, XmlNamespaceManager xmlNamespaceManager)
12+
public Message ProvideFault(Exception exception, MessageVersion messageVersion, Message requestMessage, ConcurrentXmlNamespaceLookup xmlNamespaceLookup)
1313
{
1414
var fault = new TestFault
1515
{

src/SoapCore.Tests/IntegrationTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,22 @@ public void EmptyBody()
343343
Assert.AreEqual("OK", result);
344344
}
345345

346+
/// <summary>
347+
/// Handles concurrent calls correctly.
348+
/// Test that reproduces (flaky, not with all runs) issue https://github.com/DigDes/SoapCore/issues/743
349+
/// </summary>
350+
/// <returns>Task</returns>
351+
[TestMethod]
352+
public async Task HandleConcurrentCallsCorrectly()
353+
{
354+
var client = CreateClient();
355+
356+
var r = await Task.WhenAll(client.AsyncMethod(), client.AsyncMethod());
357+
358+
Assert.AreEqual("hello, async", r[0]);
359+
Assert.AreEqual("hello, async", r[1]);
360+
}
361+
346362
private ITestService CreateClient(bool caseInsensitivePath = false)
347363
{
348364
var binding = new BasicHttpBinding();

src/SoapCore.Tests/Wsdl/WsdlTests.cs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ public async Task CheckSoapHeaderTypes(SoapSerializer soapSerializer)
905905
Trace.TraceInformation(wsdl);
906906

907907
var root = XElement.Parse(wsdl);
908-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
908+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
909909

910910
var headerComplexType = root.XPathSelectElements("//xsd:complexType[@name='AuthenticationContextSoapHeader']", nm);
911911
Assert.IsNotNull(headerComplexType);
@@ -932,7 +932,7 @@ public async Task CheckUnqualifiedMembersService(SoapSerializer soapSerializer)
932932
Trace.TraceInformation(wsdl);
933933

934934
var root = XElement.Parse(wsdl);
935-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
935+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
936936

937937
bool allNeededAreUnqualified = root.XPathSelectElements($"//xsd:complexType[@name='{nameof(TypeWithUnqualifiedMembers)}' or @name='{nameof(UnqType2)}']/xsd:sequence/xsd:element[contains(@name, 'Unqualified')]", nm)
938938
.All(x => x.Attribute("form")?.Value.Equals("unqualified") == true);
@@ -948,7 +948,7 @@ public async Task CheckUnqualifiedMembersService(SoapSerializer soapSerializer)
948948
[DataRow(SoapSerializer.DataContractSerializer)]
949949
public async Task CheckDateTimeOffsetServiceWsdl(SoapSerializer soapSerializer)
950950
{
951-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
951+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
952952

953953
var wsdl = await GetWsdlFromMetaBodyWriter<DateTimeOffsetService>(soapSerializer);
954954
var root = XElement.Parse(wsdl);
@@ -987,7 +987,7 @@ public async Task CheckXmlSchemaProviderTypeServiceWsdl(SoapSerializer soapSeria
987987
Assert.IsNotNull(wsdl);
988988

989989
var root = XElement.Parse(wsdl);
990-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
990+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
991991

992992
var responseDateElem = root.XPathSelectElement("//xsd:element[@name='GetDateResponse']/xsd:complexType/xsd:sequence/xsd:element[@name='GetDateResult' and contains(@type, ':date')]", nm);
993993
Assert.IsNotNull(responseDateElem);
@@ -1011,7 +1011,7 @@ public async Task CheckArrayServiceWsdl()
10111011
Assert.IsNotNull(wsdl);
10121012

10131013
var root = XElement.Parse(wsdl);
1014-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1014+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
10151015

10161016
var nullableArray = root.XPathSelectElement("//xsd:complexType[@name='ArrayRequest']/xsd:sequence/xsd:element[@name='LongNullableArray' and @type='tns:ArrayOfNullableLong' and @nillable='true']", nm);
10171017
Assert.IsNotNull(nullableArray);
@@ -1051,7 +1051,7 @@ public void CheckEnumServiceWsdl()
10511051
Assert.IsNotNull(wsdl);
10521052

10531053
var root = XElement.Parse(wsdl);
1054-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1054+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
10551055

10561056
var normalEnum = root.XPathSelectElement("//xsd:complexType[@name='TypeWithEnums']/xsd:sequence/xsd:element[@name='Enum' and @type='tns:NulEnum' and not(@nillable)]", nm);
10571057
Assert.IsNotNull(normalEnum);
@@ -1069,7 +1069,7 @@ public void CheckEnumSpecifiedBoolWsdl()
10691069
Assert.IsNotNull(wsdl);
10701070

10711071
var root = XElement.Parse(wsdl);
1072-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1072+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
10731073

10741074
var enumWithSpecifiedBool = root.XPathSelectElement("//xsd:complexType[@name='TypeWithSpecifiedEnum']/xsd:sequence/xsd:element[@name='Enum' and @type='tns:NulEnum' and not(@nillable) and @minOccurs='0' and @maxOccurs='1']", nm);
10751075
Assert.IsNotNull(enumWithSpecifiedBool);
@@ -1126,7 +1126,7 @@ public async Task CheckXmlAnnotatedTypeServiceWsdl()
11261126
Assert.IsFalse(wsdl.Contains("name=\"\""));
11271127

11281128
var root = XElement.Parse(wsdl);
1129-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1129+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
11301130

11311131
var requestTypeElement = root.XPathSelectElement("//xsd:element[@name='RequestRoot']", nm);
11321132
Assert.IsNotNull(requestTypeElement);
@@ -1171,7 +1171,7 @@ public void CheckXmlArrayAttributeTypeServiceWsdl()
11711171
Assert.IsNotNull(wsdl);
11721172

11731173
var root = XElement.Parse(wsdl);
1174-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1174+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
11751175

11761176
var typeWithXmlArrayAttribute = root.XPathSelectElement("//xsd:complexType[@name='TypeWithXmlArrayAttribute']/xsd:sequence/xsd:element[@name='AvlRoomTypeItems' and @type='tns:ArrayOfAvlRoomTypeItem' and @nillable='true' and @minOccurs='0' and @maxOccurs='1']", nm);
11771177
Assert.IsNotNull(typeWithXmlArrayAttribute);
@@ -1193,7 +1193,7 @@ public async Task CheckXmlAnnotatedChoiceReturnServiceWsdl()
11931193
Assert.IsFalse(wsdl.Contains("name=\"\""));
11941194

11951195
var root = XElement.Parse(wsdl);
1196-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1196+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
11971197

11981198
var requestTypeElement = root.XPathSelectElement("//xsd:element[@name='GetResponseResponse']", nm);
11991199
Assert.IsNotNull(requestTypeElement);
@@ -1224,7 +1224,7 @@ public async Task CheckMessageHeadersServiceWsdl()
12241224
Assert.IsFalse(wsdl.Contains("name=\"\""));
12251225

12261226
var root = XElement.Parse(wsdl);
1227-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1227+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
12281228

12291229
var stringPropertyElement = root.XPathSelectElement("//xsd:element[@name='ModifiedStringProperty']", nm);
12301230
Assert.IsNotNull(stringPropertyElement);
@@ -1240,7 +1240,7 @@ public async Task CheckDefaultValueAttributesServiceWsdl()
12401240
Assert.IsFalse(wsdl.Contains("name=\"\""));
12411241

12421242
var root = XElement.Parse(wsdl);
1243-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1243+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
12441244

12451245
var booleanWithNoDefaultPropertyElement = root.XPathSelectElement("//xsd:element[@name='BooleanWithNoDefaultProperty' and @minOccurs='1' and @maxOccurs='1' and not(@default)]", nm);
12461246
Assert.IsNotNull(booleanWithNoDefaultPropertyElement);
@@ -1280,7 +1280,7 @@ public async Task CheckDataContractKnownTypeAttributeServiceWsdl()
12801280
Assert.IsFalse(wsdl.Contains("name=\"\""));
12811281

12821282
var root = XElement.Parse(wsdl);
1283-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1283+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
12841284

12851285
var schemaElement = root.XPathSelectElement("//xsd:schema[@targetNamespace='http://schemas.datacontract.org/2004/07/SoapCore.Tests.Model']", nm);
12861286
Assert.IsNotNull(schemaElement);
@@ -1300,7 +1300,7 @@ public void CheckComplexBaseTypeServiceWsdl()
13001300
Assert.IsNotNull(wsdl);
13011301

13021302
var root = XElement.Parse(wsdl);
1303-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1303+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false).ToXmlNamespaceManager();
13041304

13051305
var derivedTypeContent = root.XPathSelectElement("//xsd:complexType[@name='DerivedType']/xsd:complexContent[@mixed='false']/xsd:extension[@base='tns:BaseType']/xsd:sequence/xsd:element[@name='DerivedName' and @type='xsd:string' and not(@nillable)]", nm);
13061306
Assert.IsNotNull(derivedTypeContent);
@@ -1370,7 +1370,7 @@ public void CheckSchemeOverride()
13701370
Assert.IsNotNull(wsdl);
13711371

13721372
var root = XElement.Parse(wsdl);
1373-
var nm = Namespaces.CreateDefaultXmlNamespaceManager(false);
1373+
var nm = Namespaces.CreateDefaultXmlNamespaceLookup(false);
13741374

13751375
var addressElement = GetElements(root, _soapSchema + "address").SingleOrDefault(a => a.Attribute("location")?.Value.StartsWith("https") == true);
13761376
Assert.IsNotNull(addressElement);
@@ -1417,18 +1417,18 @@ private async Task<string> GetWsdlFromMetaBodyWriter<T>(SoapSerializer serialize
14171417
{
14181418
var service = new ServiceDescription(typeof(T), false);
14191419
var baseUrl = "http://tempuri.org/";
1420-
var xmlNamespaceManager = Namespaces.CreateDefaultXmlNamespaceManager(useMicrosoftGuid);
1421-
xmlNamespaceManager.AddNamespace("tns", service.GeneralContract.Namespace);
1420+
var xmlNamespaceLookup = Namespaces.CreateDefaultXmlNamespaceLookup(useMicrosoftGuid);
1421+
xmlNamespaceLookup.AddNamespace("tns", service.GeneralContract.Namespace);
14221422
var defaultBindingName = !string.IsNullOrWhiteSpace(bindingName) ? bindingName : "BasicHttpBinding";
14231423
var bodyWriter = serializer == SoapSerializer.DataContractSerializer
14241424
? new MetaWCFBodyWriter(service, baseUrl, defaultBindingName, false, new[] { new SoapBindingInfo(MessageVersion.None, bindingName, portName) }, new DefaultWsdlOperationNameGenerator()) as BodyWriter
1425-
: new MetaBodyWriter(service, baseUrl, xmlNamespaceManager, defaultBindingName, new[] { new SoapBindingInfo(MessageVersion.None, bindingName, portName) }, useMicrosoftGuid, new DefaultWsdlOperationNameGenerator()) as BodyWriter;
1425+
: new MetaBodyWriter(service, baseUrl, xmlNamespaceLookup, defaultBindingName, new[] { new SoapBindingInfo(MessageVersion.None, bindingName, portName) }, useMicrosoftGuid, new DefaultWsdlOperationNameGenerator()) as BodyWriter;
14261426
var encoder = new SoapMessageEncoder(MessageVersion.Soap12WSAddressingAugust2004, Encoding.UTF8, false, XmlDictionaryReaderQuotas.Max, false, false, null, bindingName, portName, true);
14271427
var responseMessage = Message.CreateMessage(encoder.MessageVersion, null, bodyWriter);
14281428
responseMessage = new MetaMessage(
14291429
responseMessage,
14301430
service,
1431-
xmlNamespaceManager,
1431+
xmlNamespaceLookup,
14321432
defaultBindingName,
14331433
false,
14341434
[responseMessage.Version]);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.Collections.Concurrent;
2+
using System.Collections.Generic;
3+
using System.Xml;
4+
5+
namespace SoapCore;
6+
7+
public class ConcurrentXmlNamespaceLookup
8+
{
9+
private readonly ConcurrentDictionary<string, string> _uriToPrefix = new ();
10+
private readonly ConcurrentDictionary<string, string> _prefixToUri = new ();
11+
12+
public IDictionary<string, string> GetNamespacesInScope(XmlNamespaceScope scope) => ToXmlNamespaceManager().GetNamespacesInScope(scope);
13+
public string LookupPrefix(string uri) => _uriToPrefix.TryGetValue(uri, out var r) ? r : null;
14+
public string LookupNamespace(string prefix) => _prefixToUri.TryGetValue(prefix, out var r) ? r : null;
15+
public void AddNamespace(string prefix, string uri)
16+
{
17+
_uriToPrefix.AddOrUpdate(uri, _ => prefix, (_, _) => prefix);
18+
_prefixToUri.AddOrUpdate(prefix, _ => uri, (_, _) => uri);
19+
}
20+
public XmlNamespaceManager ToXmlNamespaceManager()
21+
{
22+
var r = new XmlNamespaceManager(new NameTable());
23+
foreach (var e in _prefixToUri)
24+
{
25+
r.AddNamespace(e.Key, e.Value);
26+
}
27+
return r;
28+
}
29+
}

src/SoapCore/CustomMessage.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public CustomMessage(Message message)
1616

1717
public Message Message { get; internal set; }
1818

19-
public XmlNamespaceManager NamespaceManager { get; internal set; }
19+
public ConcurrentXmlNamespaceLookup XmlNamespaceLookup { get; internal set; }
2020

2121
public System.Collections.Generic.Dictionary<string, string> AdditionalEnvelopeXmlnsAttributes { get; internal set; }
2222

@@ -43,14 +43,14 @@ protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
4343
writer.WriteStartDocument();
4444
}
4545

46-
var prefix = Version.Envelope.NamespacePrefix(NamespaceManager);
46+
var prefix = Version.Envelope.NamespacePrefix(XmlNamespaceLookup);
4747
writer.WriteStartElement(prefix, "Envelope", Version.Envelope.Namespace());
4848
writer.WriteXmlnsAttribute(prefix, Version.Envelope.Namespace());
4949

50-
var xsdPrefix = Namespaces.AddNamespaceIfNotAlreadyPresentAndGetPrefix(NamespaceManager, "xsd", Namespaces.XMLNS_XSD);
50+
var xsdPrefix = Namespaces.AddNamespaceIfNotAlreadyPresentAndGetPrefix(XmlNamespaceLookup, "xsd", Namespaces.XMLNS_XSD);
5151
writer.WriteXmlnsAttribute(xsdPrefix, Namespaces.XMLNS_XSD);
5252

53-
var xsiPrefix = Namespaces.AddNamespaceIfNotAlreadyPresentAndGetPrefix(NamespaceManager, "xsi", Namespaces.XMLNS_XSI);
53+
var xsiPrefix = Namespaces.AddNamespaceIfNotAlreadyPresentAndGetPrefix(XmlNamespaceLookup, "xsi", Namespaces.XMLNS_XSI);
5454
writer.WriteXmlnsAttribute(xsiPrefix, Namespaces.XMLNS_XSI);
5555

5656
if (AdditionalEnvelopeXmlnsAttributes != null)
@@ -64,12 +64,12 @@ protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
6464

6565
protected override void OnWriteStartHeaders(XmlDictionaryWriter writer)
6666
{
67-
writer.WriteStartElement(Version.Envelope.NamespacePrefix(NamespaceManager), "Header", Version.Envelope.Namespace());
67+
writer.WriteStartElement(Version.Envelope.NamespacePrefix(XmlNamespaceLookup), "Header", Version.Envelope.Namespace());
6868
}
6969

7070
protected override void OnWriteStartBody(XmlDictionaryWriter writer)
7171
{
72-
writer.WriteStartElement(Version.Envelope.NamespacePrefix(NamespaceManager), "Body", Version.Envelope.Namespace());
72+
writer.WriteStartElement(Version.Envelope.NamespacePrefix(XmlNamespaceLookup), "Body", Version.Envelope.Namespace());
7373
}
7474

7575
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)

src/SoapCore/DefaultFaultExceptionTransformer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public DefaultFaultExceptionTransformer(ExceptionTransformer exceptionTransforme
2525
_exceptionTransformer = exceptionTransformer;
2626
}
2727

28-
public Message ProvideFault(Exception exception, MessageVersion messageVersion, Message requestMessage, XmlNamespaceManager xmlNamespaceManager)
28+
public Message ProvideFault(Exception exception, MessageVersion messageVersion, Message requestMessage, ConcurrentXmlNamespaceLookup xmlNamespaceLookup)
2929
{
3030
var bodyWriter = _exceptionTransformer == null ?
3131
new FaultBodyWriter(exception, messageVersion) :
@@ -36,7 +36,7 @@ public Message ProvideFault(Exception exception, MessageVersion messageVersion,
3636
T_MESSAGE customMessage = new T_MESSAGE
3737
{
3838
Message = soapCoreFaultMessage,
39-
NamespaceManager = xmlNamespaceManager
39+
XmlNamespaceLookup = xmlNamespaceLookup
4040
};
4141

4242
return customMessage;

src/SoapCore/EnvelopeVersionExtentions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static string Namespace(this EnvelopeVersion envelopeVersion)
1515
return Namespaces.SOAP12_ENVELOPE_NS;
1616
}
1717

18-
public static string NamespacePrefix(this EnvelopeVersion envelopeVersion, XmlNamespaceManager namespaces)
18+
public static string NamespacePrefix(this EnvelopeVersion envelopeVersion, ConcurrentXmlNamespaceLookup namespaces)
1919
{
2020
string prefix;
2121
if (envelopeVersion == EnvelopeVersion.Soap11)

src/SoapCore/Extensibility/IFaultExceptionTransformer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ public interface IFaultExceptionTransformer
1919
/// <param name="exception">Exception to transform</param>
2020
/// <param name="messageVersion">SOAP message version</param>
2121
/// <param name="requestMessage">SOAP requestMessage</param>
22-
/// <param name="xmlNamespaceManager">Namespace manager</param>
22+
/// <param name="xmlNamespaceLookup">Namespace manager</param>
2323
/// <returns>Fully formatted SOAP Message</returns>
2424
/// <seealso cref="MessageFaultBodyWriter"/>
25-
Message ProvideFault(Exception exception, MessageVersion messageVersion, Message requestMessage, XmlNamespaceManager xmlNamespaceManager);
25+
Message ProvideFault(Exception exception, MessageVersion messageVersion, Message requestMessage, ConcurrentXmlNamespaceLookup xmlNamespaceLookup);
2626
}
2727
}

src/SoapCore/Meta/BodyWriterExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public static class BodyWriterExtensions
1515
//switches to easily revert to previous behaviour if there is a problem
1616
private static readonly bool UseXmlSchemaProvider = true;
1717
private static readonly bool UseXmlReflectionImporter = false;
18-
public static bool TryAddSchemaTypeFromXmlSchemaProviderAttribute(this XmlDictionaryWriter writer, Type type, string name, SoapSerializer serializer, XmlNamespaceManager xmlNamespaceManager = null, bool isUnqualified = false)
18+
public static bool TryAddSchemaTypeFromXmlSchemaProviderAttribute(this XmlDictionaryWriter writer, Type type, string name, SoapSerializer serializer, ConcurrentXmlNamespaceLookup xmlNamespaceLookup = null, bool isUnqualified = false)
1919
{
2020
if (!UseXmlSchemaProvider && !UseXmlReflectionImporter)
2121
{
@@ -47,14 +47,14 @@ public static bool TryAddSchemaTypeFromXmlSchemaProviderAttribute(this XmlDictio
4747
return true;
4848
}
4949

50-
var xmlSchemaSet = xmlNamespaceManager == null ? new XmlSchemaSet() : new XmlSchemaSet(xmlNamespaceManager.NameTable);
50+
var xmlSchemaSet = xmlNamespaceLookup == null ? new XmlSchemaSet() : new XmlSchemaSet(xmlNamespaceLookup.ToXmlNamespaceManager().NameTable);
5151
var xmlSchemaProviderAttribute = type.GetCustomAttribute<XmlSchemaProviderAttribute>(true);
5252
if (xmlSchemaProviderAttribute != null && true)
5353
{
5454
XmlSchema schema = new XmlSchema();
55-
if (xmlNamespaceManager != null)
55+
if (xmlNamespaceLookup != null)
5656
{
57-
schema.Namespaces = xmlNamespaceManager.Convert();
57+
schema.Namespaces = xmlNamespaceLookup.Convert();
5858
}
5959

6060
if (xmlSchemaProviderAttribute.IsAny)
@@ -246,10 +246,10 @@ private static string GetArrayTypeName(string typeName, bool isNullable)
246246
return "ArrayOf" + (isNullable ? "Nullable" : null) + (ClrTypeResolver.ResolveOrDefault(typeName) ?? typeName).FirstCharToUpperOrDefault();
247247
}
248248

249-
private static XmlSerializerNamespaces Convert(this XmlNamespaceManager xmlNamespaceManager)
249+
private static XmlSerializerNamespaces Convert(this ConcurrentXmlNamespaceLookup xmlNamespaceLookup)
250250
{
251251
XmlSerializerNamespaces xmlSerializerNamespaces = new XmlSerializerNamespaces();
252-
foreach (var ns in xmlNamespaceManager.GetNamespacesInScope(XmlNamespaceScope.Local))
252+
foreach (var ns in xmlNamespaceLookup.GetNamespacesInScope(XmlNamespaceScope.Local))
253253
{
254254
xmlSerializerNamespaces.Add(ns.Key, ns.Value);
255255
}

0 commit comments

Comments
 (0)