Skip to content

Commit 5e7979e

Browse files
Merge pull request #881 from DigDes/develop
v1.1.0.30
2 parents 9fae093 + 39342ca commit 5e7979e

31 files changed

+1372
-292
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerF
4242
app.UseRouting();
4343

4444
app.UseEndpoints(endpoints => {
45-
endpoints.UseSoapEndpoint<ServiceContractImpl>("/ServicePath.asmx", new SoapEncoderOptions());
45+
endpoints.UseSoapEndpoint<ServiceContractImpl>("/ServicePath.asmx", new SoapEncoderOptions(), SoapSerializer.DataContractSerializer);
4646
});
4747

4848
}

src/SoapCore.Tests/MessageFilter/WsMessageFilterTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public async Task NonceCantBePresentWithoutCreated()
8080
var usernameToken = new XElement(
8181
_wsse + "UsernameToken",
8282
new XElement(_wsse + "Username", "yourusername"),
83-
new XElement(_wsse + "Password", "yourpassword"),
83+
new XElement(_wsse + "Password", new XAttribute("Type", _passwordDigest), "yourpassword"),
8484
new XElement(_wsse + "Nonce", ToBase64String(Guid.NewGuid().ToByteArray())));
8585

8686
var filter = new WsMessageFilter("yourusername", "yourpassword");
@@ -94,7 +94,7 @@ public async Task CreatedCantBePresentWithoutNonce()
9494
var usernameToken = new XElement(
9595
_wsse + "UsernameToken",
9696
new XElement(_wsse + "Username", "yourusername"),
97-
new XElement(_wsse + "Password", "yourpassword"),
97+
new XElement(_wsse + "Password", new XAttribute("Type", _passwordDigest), "yourpassword"),
9898
new XElement(_wsu + "Created", "2003-07-16T01:24:32Z"));
9999

100100
var filter = new WsMessageFilter("yourusername", "yourpassword");
@@ -138,7 +138,7 @@ public async Task InvalidNonceIsNotAuthorizedEvenInCleartext()
138138
var usernameToken = new XElement(
139139
_wsse + "UsernameToken",
140140
new XElement(_wsse + "Username", "yourusername"),
141-
new XElement(_wsse + "Password", "yourpassword"),
141+
new XElement(_wsse + "Password", new XAttribute("Type", _passwordDigest), "yourpassword"),
142142
new XElement(_wsse + "Nonce", notBase64Encoded),
143143
new XElement(_wsu + "Created", "2020-03-06T19:58:28.134Z"));
144144

src/SoapCore.Tests/Serialization/Models.Xml/MessageContractRequestWithArrays.cs

+28
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ public class MessageContractRequestWithArrays
1818
[XmlArrayItem("ComplexModel1")]
1919
public ComplexModel1[] ArrayWithContainers { get; set; }
2020

21+
[MessageBodyMember(Namespace = "http://xmlelement-namespace/", Order = 5)]
22+
[XmlElement("ArrayWithChoiceWithoutContainers11", typeof(ComplexModel1))]
23+
[XmlElement("ArrayWithChoiceWithoutContainers12", typeof(ComplexModel2))]
24+
public object[] ArrayWithChoiceWithoutContainers1 { get; set; }
25+
26+
[MessageBodyMember(Namespace = "http://xmlelement-namespace/", Order = 5)]
27+
[XmlElement("ArrayWithChoiceWithoutContainers21", typeof(ComplexModel1))]
28+
[XmlElement("ArrayWithChoiceWithoutContainers22", typeof(ComplexModel2))]
29+
public object[] ArrayWithChoiceWithoutContainers2 { get; set; }
30+
2131
[MessageBodyMember(Namespace = "http://xmlelement-namespace/", Order = 2)]
2232
[XmlElement("ObjectArrayWithoutContainers")]
2333
public ComplexObject[] ObjectArrayWithoutContainers { get; set; }
@@ -27,6 +37,11 @@ public class MessageContractRequestWithArrays
2737
[XmlArrayItem("ComplexObject")]
2838
public ComplexObject[] ObjectArrayWithContainers { get; set; }
2939

40+
[MessageBodyMember(Namespace = "http://xmlelement-namespace/", Order = 5)]
41+
[XmlElement("EmptyArrayWithChoiceWithoutContainers1", typeof(ComplexModel1))]
42+
[XmlElement("EmptyArrayWithChoiceWithoutContainers2", typeof(ComplexModel2))]
43+
public object[] EmptyArrayWithChoiceWithoutContainers { get; set; }
44+
3045
[MessageBodyMember(Namespace = "http://xmlelement-namespace/", Order = 4)]
3146
[XmlElement("EmptyArrayWithoutContainers")]
3247
public ComplexModel1[] EmptyArrayWithoutContainers { get; set; }
@@ -52,6 +67,18 @@ public static MessageContractRequestWithArrays CreateSample()
5267
ComplexModel1.CreateSample2(),
5368
ComplexModel1.CreateSample3()
5469
},
70+
ArrayWithChoiceWithoutContainers1 = new[]
71+
{
72+
ComplexModel1.CreateSample1(),
73+
ComplexModel1.CreateSample2(),
74+
ComplexModel1.CreateSample3()
75+
},
76+
ArrayWithChoiceWithoutContainers2 = new[]
77+
{
78+
ComplexModel2.CreateSample1(),
79+
ComplexModel2.CreateSample2(),
80+
ComplexModel2.CreateSample3()
81+
},
5582
ObjectArrayWithoutContainers = new[]
5683
{
5784
ComplexObject.CreateSample1(),
@@ -64,6 +91,7 @@ public static MessageContractRequestWithArrays CreateSample()
6491
ComplexObject.CreateSample2(),
6592
ComplexObject.CreateSample3(),
6693
},
94+
EmptyArrayWithChoiceWithoutContainers = new object[0],
6795
EmptyArrayWithoutContainers = new ComplexModel1[0],
6896
EmptyArrayWithContainers = new ComplexModel1[0]
6997
};

src/SoapCore.Tests/SoapMessageProcessor/SoapMessageProcessorTests.cs

+26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Net.Http;
45
using System.ServiceModel;
56
using System.Text;
@@ -37,6 +38,31 @@ public async Task ReplaceResponseWithCustomEmptyMessageAsync()
3738
}
3839
}
3940

41+
[TestMethod]
42+
public async Task ReplaceResponseWithPongMessageAsync()
43+
{
44+
var pingValue = "abc";
45+
var body = $@"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"">
46+
<soapenv:Body>
47+
<Ping xmlns=""http://tempuri.org/"">
48+
<s>{pingValue}</s>
49+
</Ping>
50+
</soapenv:Body>
51+
</soapenv:Envelope>
52+
";
53+
using (var host = CreateTestHost())
54+
using (var client = host.CreateClient())
55+
using (var content = new StringContent(body, Encoding.UTF8, "text/xml"))
56+
using (var res = host.CreateRequest("/ServiceWithPongProcessor.svc").AddHeader("SOAPAction", @"""Ping""").And(msg => msg.Content = content).PostAsync().Result)
57+
{
58+
res.EnsureSuccessStatusCode();
59+
60+
var response = await res.Content.ReadAsStringAsync();
61+
Trace.TraceInformation(response);
62+
Assert.IsTrue(response.Contains("<PongResult>"));
63+
}
64+
}
65+
4066
[TestMethod]
4167
public async Task AssertThatTheOrdinaryHandlingAlsoWorksAsync()
4268
{

src/SoapCore.Tests/SoapMessageProcessor/Startup.cs

+16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
using System.IO;
12
using System.ServiceModel.Channels;
3+
using System.Text;
24
using System.Threading.Tasks;
5+
using System.Xml;
36
using Microsoft.AspNetCore.Builder;
47
using Microsoft.AspNetCore.Hosting;
58
using Microsoft.Extensions.DependencyInjection;
@@ -22,6 +25,18 @@ public void ConfigureServices(IServiceCollection services)
2225
{
2326
return Message.CreateMessage(MessageVersion.Soap11, "none");
2427
}
28+
else if (httpcontext.Request.Path.Value.Contains("ServiceWithPongProcessor.svc"))
29+
{
30+
var msg = await next(message);
31+
var reader = msg.GetReaderAtBodyContents();
32+
33+
var content = await reader.ReadOuterXmlAsync();
34+
35+
var ms = new MemoryStream(Encoding.UTF8.GetBytes(content.Replace("Ping", "Pong")));
36+
var xmlReader = XmlReader.Create(ms);
37+
38+
return Message.CreateMessage(msg.Version, null, xmlReader);
39+
}
2540
else
2641
{
2742
return await next(message);
@@ -37,6 +52,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerF
3752
app.UseEndpoints(x =>
3853
{
3954
x.UseSoapEndpoint<TestService>("/ServiceWithProcessor.svc", new SoapEncoderOptions(), SoapSerializer.DataContractSerializer);
55+
x.UseSoapEndpoint<TestService>("/ServiceWithPongProcessor.svc", new SoapEncoderOptions(), SoapSerializer.DataContractSerializer);
4056
x.UseSoapEndpoint<TestService>("/Service.svc", new SoapEncoderOptions(), SoapSerializer.DataContractSerializer);
4157
});
4258
}

src/SoapCore.Tests/Wsdl/WsdlTests.cs

+51-34
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,35 @@ public class WsdlTests
3030

3131
private IWebHost _host;
3232

33-
[TestMethod]
34-
public async Task CheckBindingAndPortName()
33+
[DataTestMethod]
34+
[DataRow(SoapSerializer.XmlSerializer)]
35+
[DataRow(SoapSerializer.DataContractSerializer)]
36+
public async Task CheckBindingAndPortName(SoapSerializer soapSerializer)
3537
{
36-
var wsdl = await GetWsdlFromMetaBodyWriter<TaskNoReturnService>(SoapSerializer.XmlSerializer, "MyBinding", "MyPort");
38+
var wsdl = await GetWsdlFromMetaBodyWriter<TaskNoReturnService>(soapSerializer, "BindingName", "PortName");
3739
var root = XElement.Parse(wsdl);
3840

3941
// We should have in the wsdl the definition of a complex type representing the nullable enum
40-
var bindingElements = GetElements(root, _wsdlSchema + "binding").Where(a => a.Attribute("name")?.Value.Equals("MyBinding") == true).ToArray();
42+
var bindingElements = GetElements(root, _wsdlSchema + "binding").Where(a => a.Attribute("name")?.Value.Equals("BindingName") == true).ToArray();
4143
bindingElements.ShouldNotBeEmpty();
4244

43-
var portElements = GetElements(root, _wsdlSchema + "port").Where(a => a.Attribute("name")?.Value.Equals("MyPort") == true).ToArray();
45+
var portElements = GetElements(root, _wsdlSchema + "port").Where(a => a.Attribute("name")?.Value.Equals("PortName") == true).ToArray();
4446
portElements.ShouldNotBeEmpty();
4547
}
4648

47-
[TestMethod]
48-
public async Task CheckDefaultBindingAndPortName()
49+
[DataTestMethod]
50+
[DataRow(SoapSerializer.XmlSerializer, "_soap")]
51+
[DataRow(SoapSerializer.DataContractSerializer, "")]
52+
public async Task CheckDefaultBindingAndPortName(SoapSerializer soapSerializer, string bindingSuffix)
4953
{
50-
var wsdl = await GetWsdlFromMetaBodyWriter<TaskNoReturnService>(SoapSerializer.XmlSerializer);
54+
var wsdl = await GetWsdlFromMetaBodyWriter<TaskNoReturnService>(soapSerializer);
5155
var root = XElement.Parse(wsdl);
5256

5357
// We should have in the wsdl the definition of a complex type representing the nullable enum
54-
var bindingElements = GetElements(root, _wsdlSchema + "binding").Where(a => a.Attribute("name")?.Value.Equals("BasicHttpBinding_soap") == true).ToArray();
58+
var bindingElements = GetElements(root, _wsdlSchema + "binding").Where(a => a.Attribute("name")?.Value.Equals("BasicHttpBinding" + bindingSuffix) == true).ToArray();
5559
bindingElements.ShouldNotBeEmpty();
5660

57-
var portElements = GetElements(root, _wsdlSchema + "port").Where(a => a.Attribute("name")?.Value.Equals("BasicHttpBinding_soap") == true).ToArray();
61+
var portElements = GetElements(root, _wsdlSchema + "port").Where(a => a.Attribute("name")?.Value.Equals("BasicHttpBinding" + bindingSuffix) == true).ToArray();
5862
portElements.ShouldNotBeEmpty();
5963
}
6064

@@ -440,13 +444,15 @@ public void CheckDictionaryTypeDataContract()
440444
Assert.IsNotNull(myStringElement);
441445
}
442446

443-
[TestMethod]
444-
public async Task CheckStringArrayNameWsdl()
447+
[DataTestMethod]
448+
[DataRow(SoapSerializer.XmlSerializer)]
449+
[DataRow(SoapSerializer.DataContractSerializer)]
450+
public async Task CheckStringArrayNameWsdl(SoapSerializer soapSerializer)
445451
{
446452
//StartService(typeof(StringListService));
447453
//var wsdl = GetWsdl();
448454
//StopServer();
449-
var wsdl = await GetWsdlFromMetaBodyWriter<StringListService>(SoapSerializer.XmlSerializer);
455+
var wsdl = await GetWsdlFromMetaBodyWriter<StringListService>(soapSerializer);
450456
Trace.TraceInformation(wsdl);
451457
Assert.IsNotNull(wsdl);
452458

@@ -476,13 +482,15 @@ public async Task CheckStringArrayNameWsdl()
476482
Assert.IsTrue(matched);
477483
}
478484

479-
[TestMethod]
480-
public async Task CheckComplexTypeAndOutParameterWsdl()
485+
[DataTestMethod]
486+
[DataRow(SoapSerializer.XmlSerializer)]
487+
[DataRow(SoapSerializer.DataContractSerializer)]
488+
public async Task CheckComplexTypeAndOutParameterWsdl(SoapSerializer soapSerializer)
481489
{
482490
//StartService(typeof(StringListService));
483491
//var wsdl = GetWsdl();
484492
//StopServer();
485-
var wsdl = await GetWsdlFromMetaBodyWriter<ComplexTypeAndOutParameterService>(SoapSerializer.XmlSerializer);
493+
var wsdl = await GetWsdlFromMetaBodyWriter<ComplexTypeAndOutParameterService>(soapSerializer);
486494
Trace.TraceInformation(wsdl);
487495
Assert.IsNotNull(wsdl);
488496

@@ -507,10 +515,12 @@ public async Task CheckComplexTypeAndOutParameterWsdl()
507515
Assert.IsNotNull(testElementMessage);
508516
}
509517

510-
[TestMethod]
511-
public async Task CheckUnqualifiedMembersService()
518+
[DataTestMethod]
519+
[DataRow(SoapSerializer.XmlSerializer)]
520+
[DataRow(SoapSerializer.DataContractSerializer)]
521+
public async Task CheckUnqualifiedMembersService(SoapSerializer soapSerializer)
512522
{
513-
var wsdl = await GetWsdlFromMetaBodyWriter<UnqualifiedMembersService>(SoapSerializer.XmlSerializer);
523+
var wsdl = await GetWsdlFromMetaBodyWriter<TaskNoReturnService>(soapSerializer, "BindingName", "PortName");
514524
Trace.TraceInformation(wsdl);
515525

516526
var root = XElement.Parse(wsdl);
@@ -525,13 +535,15 @@ public async Task CheckUnqualifiedMembersService()
525535
Assert.IsTrue(allNeededAreQualified);
526536
}
527537

528-
[TestMethod]
529-
public async Task CheckDateTimeOffsetServiceWsdl()
538+
[DataTestMethod]
539+
[DataRow(SoapSerializer.XmlSerializer)]
540+
[DataRow(SoapSerializer.DataContractSerializer)]
541+
public async Task CheckDateTimeOffsetServiceWsdl(SoapSerializer soapSerializer)
530542
{
531543
var nm = Namespaces.CreateDefaultXmlNamespaceManager();
532544
string systemNs = "http://schemas.datacontract.org/2004/07/System";
533545

534-
var wsdl = await GetWsdlFromMetaBodyWriter<DateTimeOffsetService>(SoapSerializer.XmlSerializer);
546+
var wsdl = await GetWsdlFromMetaBodyWriter<DateTimeOffsetService>(soapSerializer);
535547
var root = XElement.Parse(wsdl);
536548
var responseDateElem = root.XPathSelectElement($"//xsd:element[@name='MethodResponse']/xsd:complexType/xsd:sequence/xsd:element[@name='MethodResult']", nm);
537549
Assert.IsTrue(responseDateElem.ToString().Contains(systemNs));
@@ -544,10 +556,12 @@ public async Task CheckDateTimeOffsetServiceWsdl()
544556
Assert.IsNull(dayOfYearElem);
545557
}
546558

547-
[TestMethod]
548-
public async Task CheckXmlSchemaProviderTypeServiceWsdl()
559+
[DataTestMethod]
560+
[DataRow(SoapSerializer.XmlSerializer)]
561+
[DataRow(SoapSerializer.DataContractSerializer)]
562+
public async Task CheckXmlSchemaProviderTypeServiceWsdl(SoapSerializer soapSerializer)
549563
{
550-
var wsdl = await GetWsdlFromMetaBodyWriter<XmlSchemaProviderTypeService>(SoapSerializer.XmlSerializer);
564+
var wsdl = await GetWsdlFromMetaBodyWriter<XmlSchemaProviderTypeService>(soapSerializer);
551565
Trace.TraceInformation(wsdl);
552566
Assert.IsNotNull(wsdl);
553567

@@ -558,10 +572,12 @@ public async Task CheckXmlSchemaProviderTypeServiceWsdl()
558572
Assert.IsNotNull(responseDateElem);
559573
}
560574

561-
[TestMethod]
562-
public async Task CheckTestMultipleTypesServiceWsdl()
575+
[DataTestMethod]
576+
[DataRow(SoapSerializer.XmlSerializer)]
577+
[DataRow(SoapSerializer.DataContractSerializer)]
578+
public async Task CheckTestMultipleTypesServiceWsdl(SoapSerializer soapSerializer)
563579
{
564-
var wsdl = await GetWsdlFromMetaBodyWriter<TestMultipleTypesService>(SoapSerializer.XmlSerializer);
580+
var wsdl = await GetWsdlFromMetaBodyWriter<TestMultipleTypesService>(soapSerializer);
565581
Trace.TraceInformation(wsdl);
566582
Assert.IsNotNull(wsdl);
567583
}
@@ -639,7 +655,7 @@ public void CheckFieldMembersASMX()
639655
Assert.AreEqual(5, propElementsCount);
640656
}
641657

642-
[TestMethod]
658+
[DataTestMethod]
643659
public async Task CheckXmlAnnotatedTypeServiceWsdl()
644660
{
645661
var wsdl = await GetWsdlFromMetaBodyWriter<XmlModelsService>(SoapSerializer.XmlSerializer);
@@ -685,7 +701,7 @@ public async Task CheckXmlAnnotatedTypeServiceWsdl()
685701
Assert.IsNotNull(propAnonAttribute);
686702
}
687703

688-
[TestMethod]
704+
[DataTestMethod]
689705
public async Task CheckXmlAnnotatedChoiceReturnServiceWsdl()
690706
{
691707
var wsdl = await GetWsdlFromMetaBodyWriter<XmlAnnotatedChoiceReturnService>(SoapSerializer.XmlSerializer);
@@ -716,7 +732,7 @@ public async Task CheckXmlAnnotatedChoiceReturnServiceWsdl()
716732
Assert.IsNotNull(choiceComplexTypeElement.XPathSelectElement("//xsd:complexType/xsd:sequence/xsd:choice/xsd:element[@name='second' and @type='xsd:string']", nm));
717733
}
718734

719-
[TestMethod]
735+
[DataTestMethod]
720736
public async Task CheckMessageHeadersServiceWsdl()
721737
{
722738
var wsdl = await GetWsdlFromMetaBodyWriter<MessageHeadersService>(SoapSerializer.XmlSerializer);
@@ -774,12 +790,13 @@ private async Task<string> GetWsdlFromMetaBodyWriter<T>(SoapSerializer serialize
774790
var service = new ServiceDescription(typeof(T));
775791
var baseUrl = "http://tempuri.org/";
776792
var xmlNamespaceManager = Namespaces.CreateDefaultXmlNamespaceManager();
793+
var defaultBindingName = !string.IsNullOrWhiteSpace(bindingName) ? bindingName : "BasicHttpBinding";
777794
var bodyWriter = serializer == SoapSerializer.DataContractSerializer
778-
? new MetaWCFBodyWriter(service, baseUrl, "BasicHttpBinding", false) as BodyWriter
779-
: new MetaBodyWriter(service, baseUrl, xmlNamespaceManager, "BasicHttpBinding", new[] { new SoapBindingInfo(MessageVersion.None, bindingName, portName) }) as BodyWriter;
795+
? new MetaWCFBodyWriter(service, baseUrl, defaultBindingName, false, new[] { new SoapBindingInfo(MessageVersion.None, bindingName, portName) }) as BodyWriter
796+
: new MetaBodyWriter(service, baseUrl, xmlNamespaceManager, defaultBindingName, new[] { new SoapBindingInfo(MessageVersion.None, bindingName, portName) }) as BodyWriter;
780797
var encoder = new SoapMessageEncoder(MessageVersion.Soap12WSAddressingAugust2004, System.Text.Encoding.UTF8, XmlDictionaryReaderQuotas.Max, false, true, false, null, bindingName, portName);
781798
var responseMessage = Message.CreateMessage(encoder.MessageVersion, null, bodyWriter);
782-
responseMessage = new MetaMessage(responseMessage, service, xmlNamespaceManager, "BasicHttpBinding", false);
799+
responseMessage = new MetaMessage(responseMessage, service, xmlNamespaceManager, defaultBindingName, false);
783800

784801
using (var memoryStream = new MemoryStream())
785802
{

src/SoapCore/CustomStringWriter.cs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.IO;
2+
using System.Text;
3+
4+
namespace SoapCore
5+
{
6+
public class CustomStringWriter : StringWriter
7+
{
8+
private readonly Encoding _encoding;
9+
10+
public CustomStringWriter(Encoding encoding)
11+
{
12+
_encoding = encoding;
13+
}
14+
15+
public override Encoding Encoding
16+
{
17+
get
18+
{
19+
return _encoding;
20+
}
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)