Skip to content

Commit 8dac01b

Browse files
Merge pull request #285 from TransactionProcessing/bug/#284_response_logging_in_wcf_broken
Fix to response logging middleware
2 parents fbfc004 + 60e616c commit 8dac01b

3 files changed

Lines changed: 65 additions & 18 deletions

File tree

Shared/General/ConfigurationReader.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,25 @@ public static T GetValueFromSection<T>(String sectionName,
7575
return ConfigurationReader.GetTypedValueFromSection<T>(sectionName, keyName);
7676
}
7777

78+
public static T GetValueOrDefault<T>(String sectionName, String keyName, T defaultValue)
79+
{
80+
try
81+
{
82+
var value = ConfigurationReader.GetValue(sectionName, keyName);
83+
84+
if (String.IsNullOrEmpty(value))
85+
{
86+
return defaultValue;
87+
}
88+
89+
return (T)Convert.ChangeType(value, typeof(T));
90+
}
91+
catch (KeyNotFoundException kex)
92+
{
93+
return defaultValue;
94+
}
95+
}
96+
7897
/// <summary>
7998
/// Initialises the specified configuration root.
8099
/// </summary>

Shared/Middleware/RequestLoggingMiddleware.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@ public RequestLoggingMiddleware(RequestDelegate next)
2222
}
2323
#endregion
2424

25-
#region Public Methods
26-
2725
#region public async Task Invoke(HttpContext context)
2826
public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingConfig configuration)
2927
{
30-
var originalRequestBody = context.Request.Body;
31-
if (configuration.LogRequests)
28+
if (configuration.LogRequests == false)
29+
{
30+
await next(context);
31+
}
32+
else
3233
{
3334
var requestBodyStream = new MemoryStream();
35+
var originalRequestBody = context.Request.Body;
3436

3537
await context.Request.Body.CopyToAsync(requestBodyStream);
3638
requestBodyStream.Seek(0, SeekOrigin.Begin);
@@ -49,13 +51,11 @@ public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingCo
4951

5052
requestBodyStream.Seek(0, SeekOrigin.Begin);
5153
context.Request.Body = requestBodyStream;
52-
}
5354

54-
await next(context);
55-
context.Request.Body = originalRequestBody;
55+
await next(context);
56+
context.Request.Body = originalRequestBody;
57+
}
5658
}
5759
#endregion
58-
59-
#endregion
6060
}
6161
}

Shared/Middleware/ResponseLoggingMiddleware.cs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,20 @@ public ResponseLoggingMiddleware(RequestDelegate next)
2929
#region public async Task Invoke(HttpContext context)
3030
public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingConfig configuration)
3131
{
32-
var url = context.Request.GetDisplayUrl();
33-
var bodyStream = context.Response.Body;
32+
if (configuration.LogResponses == false)
33+
{
34+
await next(context);
35+
}
36+
else
37+
{
38+
var url = context.Request.GetDisplayUrl();
39+
var bodyStream = context.Response.Body;
3440

35-
var responseBodyStream = new MemoryStream();
36-
context.Response.Body = responseBodyStream;
41+
var responseBodyStream = new ResponseLoggingMemoryStream();
42+
context.Response.Body = responseBodyStream;
3743

38-
await next(context);
44+
await next(context);
3945

40-
if (configuration.LogResponses)
41-
{
4246
responseBodyStream.Seek(0, SeekOrigin.Begin);
4347
var responseBody = await new StreamReader(responseBodyStream).ReadToEndAsync();
4448
StringBuilder logMessage = new StringBuilder();
@@ -52,12 +56,36 @@ public async Task Invoke(HttpContext context, RequestResponseMiddlewareLoggingCo
5256
Helpers.LogMessage(url, logMessage, configuration.LoggingLevel);
5357

5458
responseBodyStream.Seek(0, SeekOrigin.Begin);
55-
}
59+
await responseBodyStream.CopyToAsync(bodyStream);
5660

57-
await responseBodyStream.CopyToAsync(bodyStream);
61+
if (responseBodyStream.IsDisposed() && context.Request.Headers.ContainsKey("SOAPAction"))
62+
{
63+
responseBodyStream.ForceClose();
64+
}
65+
}
5866
}
5967
#endregion
6068

6169
#endregion
6270
}
71+
72+
public class ResponseLoggingMemoryStream : MemoryStream
73+
{
74+
public override void Close()
75+
{
76+
// Dont close by default
77+
// base.Close();
78+
}
79+
80+
public void ForceClose()
81+
{
82+
base.Close();
83+
}
84+
85+
public bool IsDisposed()
86+
{
87+
return this.CanRead && this.CanSeek && this.CanWrite;
88+
}
89+
90+
}
6391
}

0 commit comments

Comments
 (0)