Skip to content

Commit f351672

Browse files
committed
DevDiv bug 388519 --[Monitoring] HttpActionBindingTracer was not created, and tracing did not show the roll-up of model binding results.
1 parent a1f2be1 commit f351672

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

src/System.Web.Http/Tracing/Tracers/ActionValueBinderTracer.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@ HttpActionBinding IActionValueBinder.GetBinding(HttpActionDescriptor actionDescr
3434
: (HttpParameterBinding)new HttpParameterBindingTracer(parameterBinding, _traceWriter);
3535
}
3636

37-
HttpActionBinding newActionBinding = new HttpActionBinding(actionDescriptor, newParameterBindings);
38-
return newActionBinding;
37+
// Replace the inner HttpActionBinding's parameter bindings with our tracing versions.
38+
// This allows each individual parameter binding to trace.
39+
actionBinding.ParameterBindings = newParameterBindings;
40+
41+
// Then create an HttpActionBindingTracer to wrap the actual HttpActionBinding
42+
return new HttpActionBindingTracer(actionBinding, _traceWriter);
3943
}
4044
}
4145
}

src/System.Web.Http/Tracing/Tracers/HttpActionBindingTracer.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ public HttpActionBindingTracer(HttpActionBinding innerBinding, ITraceWriter trac
1616
{
1717
_innerBinding = innerBinding;
1818
_traceWriter = traceWriter;
19+
20+
// Properties that cannot be delegated to the inner must be replicated.
21+
// They must also avoid an ArgumentNullException for null values.
22+
if (_innerBinding.ParameterBindings != null)
23+
{
24+
ParameterBindings = _innerBinding.ParameterBindings;
25+
}
26+
27+
if (_innerBinding.ActionDescriptor != null)
28+
{
29+
ActionDescriptor = _innerBinding.ActionDescriptor;
30+
}
1931
}
2032

2133
public override Task ExecuteBindingAsync(Controllers.HttpActionContext actionContext, CancellationToken cancellationToken)

test/System.Web.Http.Test/Tracing/Tracers/ActionValueBinderTracerTest.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,35 @@ namespace System.Web.Http.Tracing.Tracers
1111
{
1212
public class ActionValueBinderTracerTest
1313
{
14+
[Fact]
15+
public void GetBinding_Returns_HttpActionBindingTracer()
16+
{
17+
// Arrange
18+
Mock<HttpActionDescriptor> mockActionDescriptor = new Mock<HttpActionDescriptor>() { CallBase = true };
19+
mockActionDescriptor.Setup(a => a.ActionName).Returns("test");
20+
mockActionDescriptor.Setup(a => a.GetParameters()).Returns(new Collection<HttpParameterDescriptor>(new HttpParameterDescriptor[0]));
21+
22+
Mock<HttpParameterDescriptor> mockParameterDescriptor = new Mock<HttpParameterDescriptor>() { CallBase = true };
23+
Mock<HttpParameterBinding> mockParameterBinding = new Mock<HttpParameterBinding>(mockParameterDescriptor.Object) { CallBase = true };
24+
HttpActionBinding actionBinding = new HttpActionBinding(mockActionDescriptor.Object, new HttpParameterBinding[] { mockParameterBinding.Object });
25+
26+
HttpControllerDescriptor controllerDescriptor = new HttpControllerDescriptor(new HttpConfiguration(), "controller", typeof(ApiController));
27+
28+
HttpControllerContext controllerContext = ContextUtil.CreateControllerContext(request: new HttpRequestMessage());
29+
controllerContext.ControllerDescriptor = controllerDescriptor;
30+
31+
Mock<IActionValueBinder> mockBinder = new Mock<IActionValueBinder>() { CallBase = true };
32+
mockBinder.Setup(b => b.GetBinding(It.IsAny<HttpActionDescriptor>())).Returns(actionBinding);
33+
ActionValueBinderTracer tracer = new ActionValueBinderTracer(mockBinder.Object, new TestTraceWriter());
34+
35+
// Act
36+
HttpActionBinding actualBinding = ((IActionValueBinder)tracer).GetBinding(mockActionDescriptor.Object);
37+
38+
// Assert
39+
Assert.IsType<HttpActionBindingTracer>(actualBinding);
40+
Assert.Same(mockActionDescriptor.Object, actualBinding.ActionDescriptor);
41+
}
42+
1443
[Fact]
1544
public void GetBinding_Invokes_Inner_And_Returns_ActionBinder_With_Tracing_HttpParameterBinding()
1645
{

0 commit comments

Comments
 (0)