diff --git a/src/SoapCore.Tests/Wsdl/WsdlTests.cs b/src/SoapCore.Tests/Wsdl/WsdlTests.cs index 0d5d6d3a..b0f989d5 100644 --- a/src/SoapCore.Tests/Wsdl/WsdlTests.cs +++ b/src/SoapCore.Tests/Wsdl/WsdlTests.cs @@ -742,7 +742,7 @@ private async Task GetWsdlFromMetaBodyWriter(SoapSerializer serialize var bodyWriter = serializer == SoapSerializer.DataContractSerializer ? new MetaWCFBodyWriter(service, baseUrl, "BasicHttpBinding", false) as BodyWriter : new MetaBodyWriter(service, baseUrl, xmlNamespaceManager, "BasicHttpBinding", new[] { MessageVersion.None }) as BodyWriter; - var encoder = new SoapMessageEncoder(MessageVersion.Soap12WSAddressingAugust2004, System.Text.Encoding.UTF8, XmlDictionaryReaderQuotas.Max, false, true); + var encoder = new SoapMessageEncoder(MessageVersion.Soap12WSAddressingAugust2004, System.Text.Encoding.UTF8, XmlDictionaryReaderQuotas.Max, false, true, false); var responseMessage = Message.CreateMessage(encoder.MessageVersion, null, bodyWriter); responseMessage = new MetaMessage(responseMessage, service, xmlNamespaceManager, "BasicHttpBinding", false); diff --git a/src/SoapCore/MessageEncoder/SoapMessageEncoder.cs b/src/SoapCore/MessageEncoder/SoapMessageEncoder.cs index ca2a254a..9b4aaddf 100644 --- a/src/SoapCore/MessageEncoder/SoapMessageEncoder.cs +++ b/src/SoapCore/MessageEncoder/SoapMessageEncoder.cs @@ -28,11 +28,13 @@ public class SoapMessageEncoder private readonly bool _omitXmlDeclaration; private readonly bool _indentXml; private readonly bool _supportXmlDictionaryReader; + private readonly bool _checkXmlCharacters; - public SoapMessageEncoder(MessageVersion version, Encoding writeEncoding, XmlDictionaryReaderQuotas quotas, bool omitXmlDeclaration, bool indentXml) + public SoapMessageEncoder(MessageVersion version, Encoding writeEncoding, XmlDictionaryReaderQuotas quotas, bool omitXmlDeclaration, bool indentXml, bool checkXmlCharacters) { _indentXml = indentXml; _omitXmlDeclaration = omitXmlDeclaration; + _checkXmlCharacters = checkXmlCharacters; if (writeEncoding == null) { throw new ArgumentNullException(nameof(writeEncoding)); @@ -153,7 +155,8 @@ public virtual async Task WriteMessageAsync(Message message, PipeWriter pipeWrit OmitXmlDeclaration = _optimizeWriteForUtf8 && _omitXmlDeclaration, //can only omit if utf-8 Indent = _indentXml, Encoding = _writeEncoding, - CloseOutput = true + CloseOutput = true, + CheckCharacters = _checkXmlCharacters }); using var xmlWriter = XmlDictionaryWriter.CreateDictionaryWriter(xmlTextWriter); @@ -183,7 +186,8 @@ public virtual Task WriteMessageAsync(Message message, Stream stream) OmitXmlDeclaration = _optimizeWriteForUtf8 && _omitXmlDeclaration, //can only omit if utf-8, Indent = _indentXml, Encoding = _writeEncoding, - CloseOutput = false + CloseOutput = false, + CheckCharacters = _checkXmlCharacters }); using var xmlWriter = XmlDictionaryWriter.CreateDictionaryWriter(xmlTextWriter); diff --git a/src/SoapCore/SoapCoreOptions.cs b/src/SoapCore/SoapCoreOptions.cs index 1e2ef409..bfad83fc 100644 --- a/src/SoapCore/SoapCoreOptions.cs +++ b/src/SoapCore/SoapCoreOptions.cs @@ -86,6 +86,12 @@ public class SoapCoreOptions /// public bool IndentXml { get; set; } = true; + /// + /// Gets or sets a value indicating whether to check to make sure that the XmlOutput doesn't contain invalid characters + /// Defaults to true + /// + public bool CheckXmlCharacters { get; set; } = true; + /// /// Gets or sets an collection of Xml Namespaces to override the default prefix for. /// diff --git a/src/SoapCore/SoapEndpointMiddleware.cs b/src/SoapCore/SoapEndpointMiddleware.cs index 8e34a2ff..3b05b0d4 100644 --- a/src/SoapCore/SoapEndpointMiddleware.cs +++ b/src/SoapCore/SoapEndpointMiddleware.cs @@ -69,7 +69,7 @@ public SoapEndpointMiddleware(ILogger> logger, for (var i = 0; i < options.EncoderOptions.Length; i++) { - _messageEncoders[i] = new SoapMessageEncoder(options.EncoderOptions[i].MessageVersion, options.EncoderOptions[i].WriteEncoding, options.EncoderOptions[i].ReaderQuotas, options.OmitXmlDeclaration, options.IndentXml); + _messageEncoders[i] = new SoapMessageEncoder(options.EncoderOptions[i].MessageVersion, options.EncoderOptions[i].WriteEncoding, options.EncoderOptions[i].ReaderQuotas, options.OmitXmlDeclaration, options.IndentXml, options.CheckXmlCharacters); } } @@ -686,9 +686,12 @@ private async Task WriteErrorResponseMessage( var faultExceptionTransformer = serviceProvider.GetRequiredService(); var faultMessage = faultExceptionTransformer.ProvideFault(exception, messageEncoder.MessageVersion, requestMessage, xmlNamespaceManager); - httpContext.Response.ContentType = httpContext.Request.ContentType; - httpContext.Response.Headers["SOAPAction"] = faultMessage.Headers.Action; - httpContext.Response.StatusCode = statusCode; + if(!httpContext.Response.HasStarted) + { + httpContext.Response.ContentType = httpContext.Request.ContentType; + httpContext.Response.Headers["SOAPAction"] = faultMessage.Headers.Action; + httpContext.Response.StatusCode = statusCode; + } SetHttpResponse(httpContext, faultMessage); if (messageEncoder.MessageVersion.Addressing == AddressingVersion.WSAddressing10) diff --git a/src/SoapCore/SoapOptions.cs b/src/SoapCore/SoapOptions.cs index 15a8b99c..8c082359 100644 --- a/src/SoapCore/SoapOptions.cs +++ b/src/SoapCore/SoapOptions.cs @@ -41,6 +41,12 @@ public class SoapOptions public bool IndentXml { get; set; } = true; + /// + /// Gets or sets a value indicating whether to check to make sure that the XmlOutput doesn't contain invalid characters + /// Defaults to true + /// + public bool CheckXmlCharacters { get; set; } = true; + public XmlNamespaceManager XmlNamespacePrefixOverrides { get; set; } public WsdlFileOptions WsdlFileOptions { get; set; } @@ -66,7 +72,8 @@ public static SoapOptions FromSoapCoreOptions(SoapCoreOptions opt, Type serviceT OmitXmlDeclaration = opt.OmitXmlDeclaration, IndentXml = opt.IndentXml, XmlNamespacePrefixOverrides = opt.XmlNamespacePrefixOverrides, - WsdlFileOptions = opt.WsdlFileOptions + WsdlFileOptions = opt.WsdlFileOptions, + CheckXmlCharacters = opt.CheckXmlCharacters }; #pragma warning disable CS0612 // Type or member is obsolete