Overview
This is an open source (Apache License 2.0) .NET Standard 2.0 code library that provides a fluent API to make it as easy as possible to create a SOAP 1.1 or SOAP 1.2 message.
Among other things, it is perfect for building SOAP envelopes to use in lightweight web frameworks such as Nancy.
Getting Started
NuGet Package Installation
To install the ChannelAdam.Soap NuGet package run the following command in the Package Manager Console:
1PM> Install-Package ChannelAdam.Soap
Usage
There are plenty of overloads and other methods for more advanced usage - see the reference in the next section.
SOAP Envelope with a Header Action and Body
Here is a simple example of creating a SOAP 1.1 envelope with a header action and body payload.
1string envelopeXml = SoapBuilder.CreateSoap11Envelope()
2 .WithHeader.AddAction("http://my.action/here")
3 .WithBody.AddEntry("<myXml>hello from the body</myXml>")
4 .Build()
5 .ToString();
And for SOAP 1.2:
1string envelopeXml = SoapBuilder.CreateSoap12Envelope()
2 .WithHeader.AddAction("http://my.action/here")
3 .WithBody.AddEntry("<myXml>hello from the body</myXml>")
4 .Build()
5 .ToString();
There is even an overload to create the body entry from .NET objects. For instance:
1public class MyModel
2{
3 public string Value { get; set; }
4}
5
6...
7
8var model = new MyModel { Value = "hello!" };
9
10string envelopeXml = SoapBuilder.CreateSoap12Envelope()
11 .WithHeader.AddAction("http://my.action/here")
12 .WithBody.AddEntry(model)
13 .Build()
14 .ToString();
Easy!
SOAP Faults
To create a SOAP 1.1 fault:
1string envelopeXml = SoapBuilder.CreateSoap11Envelope()
2 .WithBody.SetFault(Soap11FaultCode.Client, "SOAP 1.1 fault string here")
3 .Build()
4 .ToString();
And for a SOAP 1.2 fault:
1string envelopeXml = SoapBuilder.CreateSoap11Envelope()
2 .WithBody.SetFault(Soap12FaultCode.Sender, "SOAP 1.2 fault reason here")
3 .Build()
4 .ToString();
There are overloads to set other SOAP fault value properties as well.
Reference
This reference assumes that the reader is familiar with SOAP terminology. For more information see the following SOAP specifications:
SoapBuilder
The SoapBuilder static class is the fluent starting point for building a SOAP 1.1 or SOAP 1.2 envelope.
The SoapBuilder
static class has two methods:
-
ISoap11EnvelopeBuilder CreateSoap11Envelope()
- to start the process of creating a SOAP 1.1 envelope -
ISoap12EnvelopeBuilder CreateSoap12Envelope()
- to start the process of creating a SOAP 1.2 envelope
The ISoap11EnvelopeBuilder
interface has two properties and one method:
-
ISoap11BodyBuilder WithBody { get; }
- to specify the SOAP body or a fault -
ISoap11HeaderBuilder WithHeader { get; }
- to specify the SOAP header -
XContainer Build()
- to finally build the SOAP envelope as specified
The ISoap12EnvelopeBuilder
interface is similar:
-
ISoap12BodyBuilder WithBody { get; }
-
ISoap12HeaderBuilder WithHeader { get; }
-
XContainer Build()
Usage of SoapBuilder
The general procedure for usage is:
-
Call one of the
SoapBuilder.CreateSoap??Envelope()
methods. -
If necessary, add a header via the
WithHeader
property. -
Add a body or fault message via the
WithBody
property. -
Once all the details have been specified, simply call the
Build()
method which will return anXContainer
. -
If there is something that you need to do to the contents of the SOAP envelope that is not currently allowed by the API, then you can always directly modify the elements in the
XContainer
and do magical things with LINQ. -
A simple
.ToString()
on theXContainer
returned fromBuild()
will then give you the XML string of the SOAP envelope/payload - by default formatted with indentation. There is also the overload.ToString(System.Xml.Linq.SaveOptions options)
that allows you to change the formatting of whitespace and indentation.
Specify the SOAP Header
The SOAP header can be specified via the WithHeader
property.
For SOAP 1.1, WithHeader
chains the following methods:
1ISoap11EnvelopeBuilder AddAction(string action);
2
3ISoap11EnvelopeBuilder AddBlock(string headerXml);
4ISoap11EnvelopeBuilder AddBlock(XContainer headerBlock);
5ISoap11EnvelopeBuilder AddBlock(object toSerialise);
6ISoap11EnvelopeBuilder AddBlock(object toSerialise, string toElementName, string toElementNamespace);
7
8ISoap11EnvelopeBuilder SetStandardSoapEncoding();
9ISoap11EnvelopeBuilder SetCustomSoapEncoding(string soapEncodingNamespace);
Notes:
AddAction(string action)
adds an action header block with the specified action.AddBlock(XContainer headerBlock)
adds any arbitrary header block - e.g. from aSystem.Xml.Linq.XElement
.AddBlock(object toSerialise, string toElementName, string toElementNamespace)
serialises the given object and during serialisation overrides the XML element name and namespace with those specified.ISoap11EnvelopeBuilder SetStandardSoapEncoding()
sets the SoapEncoding attribute to the standard encoding namespaceISoap11EnvelopeBuilder SetCustomSoapEncoding(string soapEncodingNamespace)
sets the SoapEncoding attribute to your custom namespace
For SOAP 1.2, WithHeader
is nearly identical to SOAP 1.1, except an ISoap12EnvelopeBuilder
is returned instead of a ISoap11EnvelopeBuilder
.
Specify the SOAP Body Payload or Fault
The SOAP body payload or fault can be specified via the WithBody
property which provides the following methods.
For SOAP 1.1
1ISoap11EnvelopeBuilder AddEntry(string bodyXml);
2ISoap11EnvelopeBuilder AddEntry(XContainer fromNode);
3ISoap11EnvelopeBuilder AddEntry(object toSerialise);
4ISoap11EnvelopeBuilder AddEntry(object toSerialise, string toElementName, string toElementNamespace);
5
6ISoap11EnvelopeBuilder SetFault(Soap11FaultCode code, string faultString);
7ISoap11EnvelopeBuilder SetFault(Soap11FaultCode code, string faultString, string faultActor);
8ISoap11EnvelopeBuilder SetFault(Soap11FaultCode code, string faultString, string faultActor, IEnumerable<XContainer> detailEntries);
9
10ISoap11EnvelopeBuilder SetStandardSoapEncoding();
11ISoap11EnvelopeBuilder SetCustomSoapEncoding(string soapEncodingNamespace);
Notes:
AddEntry(object toSerialise, string toElementName, string toElementNamespace)
serialises the given object and during serialisation overrides the XML element name and namespace with those specified.
SOAP 1.2 Faults are more descriptive than SOAP 1.1, hence the overloads of SetFault
with more parameters.
For SOAP 1.2
1ISoap12EnvelopeBuilder AddEntry(string bodyXml);
2ISoap12EnvelopeBuilder AddEntry(XContainer fromNode);
3ISoap12EnvelopeBuilder AddEntry(object toSerialise);
4ISoap12EnvelopeBuilder AddEntry(object toSerialise, string toElementName, string toElementNamespace);
5
6ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, string reason);
7ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, string subCode, string reason);
8ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason);
9ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason, string reasonXmlLanguage);
10ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason, string reasonXmlLanguage, string node);
11ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason, string reasonXmlLanguage, string node, string role);
12ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason, IEnumerable<XContainer> detailEntries);
13ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason, string reasonXmlLanguage, IEnumerable<XContainer> detailEntries);
14ISoap12EnvelopeBuilder SetFault(Soap12FaultCode code, XNamespace subCodeNamespace, string subCode, string reason, string reasonXmlLanguage, string node, string role, IEnumerable<XContainer> detailEntries);
15
16ISoap12EnvelopeBuilder SetStandardSoapEncoding();
17ISoap12EnvelopeBuilder SetCustomSoapEncoding(string soapEncodingNamespace);
comments powered by Disqus