Skip to content

Commit

Permalink
Merge pull request #278 from Simon-Campbell/expose-default-fault-tran…
Browse files Browse the repository at this point in the history
…sformer

Make a default FaultExceptionTransformer
  • Loading branch information
kotovaleksandr authored Jun 19, 2019
2 parents c20fbec + 8e86a03 commit 49079ec
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 24 deletions.
35 changes: 35 additions & 0 deletions src/SoapCore/DefaultFaultExceptionTransformer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.ServiceModel.Channels;

namespace SoapCore
{
/// <summary>
/// The default implementation of the fault provider when an unexpected exception occurs. This can be replaced or
/// extended by registering your own IFaultExceptionTransformer in the service collection on startup.
/// </summary>
public class DefaultFaultExceptionTransformer : IFaultExceptionTransformer
{
private readonly ExceptionTransformer _exceptionTransformer;

public DefaultFaultExceptionTransformer()
{
_exceptionTransformer = null;
}

public DefaultFaultExceptionTransformer(ExceptionTransformer exceptionTransformer)
{
_exceptionTransformer = exceptionTransformer;
}

public Message ProvideFault(Exception exception, MessageVersion messageVersion)
{
var bodyWriter = _exceptionTransformer == null ?
new FaultBodyWriter(exception, messageVersion) :
new FaultBodyWriter(exception, messageVersion, faultStringOverride: _exceptionTransformer.Transform(exception));

var soapCoreFaultMessage = Message.CreateMessage(messageVersion, null, bodyWriter);

return new CustomMessage(soapCoreFaultMessage);
}
}
}
7 changes: 2 additions & 5 deletions src/SoapCore/ExceptionTransformer.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System;

namespace SoapCore
{
internal class ExceptionTransformer
public class ExceptionTransformer
{
private readonly Func<Exception, string> _transformer;

Expand Down
2 changes: 2 additions & 0 deletions src/SoapCore/SoapEndpointExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ public static IApplicationBuilder UseSoapEndpoint(this IApplicationBuilder build
public static IServiceCollection AddSoapCore(this IServiceCollection serviceCollection)
{
serviceCollection.TryAddSingleton<IOperationInvoker, DefaultOperationInvoker>();
serviceCollection.TryAddSingleton<IFaultExceptionTransformer, DefaultFaultExceptionTransformer>();

return serviceCollection;
}

Expand Down
21 changes: 2 additions & 19 deletions src/SoapCore/SoapEndpointMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -663,25 +663,8 @@ private Message WriteErrorResponseMessage(
MessageEncoder messageEncoder,
HttpContext httpContext)
{
Message faultMessage;

var faultExceptionTransformer = serviceProvider.GetService<IFaultExceptionTransformer>();

if (faultExceptionTransformer != null)
{
faultMessage = faultExceptionTransformer.ProvideFault(exception, messageEncoder.MessageVersion);
}
else
{
var transformer = serviceProvider.GetService<ExceptionTransformer>();

var bodyWriter = transformer == null ?
new FaultBodyWriter(exception, messageEncoder.MessageVersion) :
new FaultBodyWriter(exception, messageEncoder.MessageVersion, faultStringOverride: transformer.Transform(exception));

var soapCoreFaultMessage = Message.CreateMessage(messageEncoder.MessageVersion, null, bodyWriter);
faultMessage = new CustomMessage(soapCoreFaultMessage);
}
var faultExceptionTransformer = serviceProvider.GetRequiredService<IFaultExceptionTransformer>();
var faultMessage = faultExceptionTransformer.ProvideFault(exception, messageEncoder.MessageVersion);

httpContext.Response.ContentType = httpContext.Request.ContentType;
httpContext.Response.Headers["SOAPAction"] = faultMessage.Headers.Action;
Expand Down

0 comments on commit 49079ec

Please sign in to comment.