// Creates wrapping tracers for all HttpParameterBindings HttpActionBinding IActionValueBinder.GetBinding(HttpActionDescriptor actionDescriptor) { HttpActionBinding actionBinding = _innerBinder.GetBinding(actionDescriptor); if (actionBinding == null) { return(null); } HttpParameterBinding[] parameterBindings = actionBinding.ParameterBindings; HttpParameterBinding[] newParameterBindings = new HttpParameterBinding[parameterBindings.Length]; for (int i = 0; i < newParameterBindings.Length; i++) { HttpParameterBinding parameterBinding = parameterBindings[i]; // Intercept FormatterParameterBinding to replace its formatters FormatterParameterBinding formatterParameterBinding = parameterBinding as FormatterParameterBinding; newParameterBindings[i] = formatterParameterBinding != null ? (HttpParameterBinding) new FormatterParameterBindingTracer(formatterParameterBinding, _traceWriter) : (HttpParameterBinding) new HttpParameterBindingTracer(parameterBinding, _traceWriter); } // Replace the inner HttpActionBinding's parameter bindings with our tracing versions. // This allows each individual parameter binding to trace. actionBinding.ParameterBindings = newParameterBindings; // Then create an HttpActionBindingTracer to wrap the actual HttpActionBinding if (!(actionBinding is HttpActionBindingTracer)) { return(new HttpActionBindingTracer(actionBinding, _traceWriter)); } return(actionBinding); }
private void Bind(string methodName) { //创建FormatterParameterBinding对象 MethodInfo method = typeof(ContactsController).GetMethod(methodName); HttpActionDescriptor actionDescriptor = new ReflectedHttpActionDescriptor(this.ControllerContext.ControllerDescriptor, method); HttpParameterDescriptor parameterDescriptor = actionDescriptor.GetParameters().First(); MediaTypeFormatter[] formatters = new MediaTypeFormatter[] { new JsonMediaTypeFormatter() }; FormatterParameterBinding parameterBinding = new FormatterParameterBinding(parameterDescriptor, formatters, null); //创建HttpActionBinding并执行 HttpActionBinding actionBinding = new HttpActionBinding(actionDescriptor, new FormatterParameterBinding[] { parameterBinding }); HttpActionContext actionContext = new HttpActionContext(this.ControllerContext, actionDescriptor); try { actionBinding.ExecuteBindingAsync(actionContext, CancellationToken.None).Wait(); //获取绑定参数对象并打印相关数据 Contact contact = (Contact)actionContext.ActionArguments["contact"]; Console.WriteLine("{0,-12}: {1}", "Name", contact.Name); Console.WriteLine("{0,-12}: {1}", "Phone No.", contact.PhoneNo); Console.WriteLine("{0,-12}: {1}", "EmailAddress", contact.EmailAddress); Console.WriteLine("{0,-12}: {1}", "Address", contact.Address); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
public void Decorator_GetInner_On_FormatterParameterBindingTracer_Returns_FormatterParameterBinding() { // Arrange HttpParameterDescriptor httpParameterDescriptor = new Mock <HttpParameterDescriptor>().Object; MediaTypeFormatterCollection mediaTypeFormatterCollection = new MediaTypeFormatterCollection(); FormatterParameterBinding expectedInner = new FormatterParameterBinding( httpParameterDescriptor, mediaTypeFormatterCollection, null ); FormatterParameterBindingTracer productUnderTest = new FormatterParameterBindingTracer( expectedInner, new TestTraceWriter() ); // Act FormatterParameterBinding actualInner = Decorator.GetInner( productUnderTest as FormatterParameterBinding ); // Assert Assert.Same(expectedInner, actualInner); }
public void BindWithFormatter() { HttpParameterDescriptor param = CreateParameterDescriptor(); FormatterParameterBinding binding = (FormatterParameterBinding)param.BindWithFormatter(); Assert.NotNull(binding); }
public FormatterParameterBindingTracer(FormatterParameterBinding innerBinding, ITraceWriter traceWriter) : base(innerBinding.Descriptor, innerBinding.Formatters, innerBinding.BodyModelValidator) { Contract.Assert(innerBinding != null); Contract.Assert(traceWriter != null); _innerBinding = innerBinding; _traceWriter = traceWriter; }
public void BindWithFormatter_Formatter_Array() { HttpParameterDescriptor param = CreateParameterDescriptor(); MediaTypeFormatter formatter1 = new XmlMediaTypeFormatter(); MediaTypeFormatter formatter2 = new JsonMediaTypeFormatter(); FormatterParameterBinding binding = (FormatterParameterBinding)param.BindWithFormatter(formatter1, formatter2); Assert.NotNull(binding); MediaTypeFormatter[] formatters = binding.Formatters.ToArray(); Assert.Equal(2, formatters.Length); Assert.Equal(formatter1, formatters[0]); Assert.Equal(formatter2, formatters[1]); }
public void BindWithFormatter_Formatters_and_Validator() { HttpParameterDescriptor param = CreateParameterDescriptor(); IBodyModelValidator bodyModelValidator = new Mock <IBodyModelValidator>().Object; MediaTypeFormatter formatter1 = new XmlMediaTypeFormatter(); MediaTypeFormatter formatter2 = new JsonMediaTypeFormatter(); FormatterParameterBinding binding = (FormatterParameterBinding)param.BindWithFormatter(new List <MediaTypeFormatter> { formatter1, formatter2 }, bodyModelValidator); Assert.NotNull(binding); Assert.Equal(bodyModelValidator, binding.BodyModelValidator); MediaTypeFormatter[] formatters = binding.Formatters.ToArray(); Assert.Equal(2, formatters.Length); Assert.Equal(formatter1, formatters[0]); Assert.Equal(formatter2, formatters[1]); }
// Creates wrapping tracers for all HttpParameterBindings HttpActionBinding IActionValueBinder.GetBinding(HttpActionDescriptor actionDescriptor) { HttpActionBinding actionBinding = _innerBinder.GetBinding(actionDescriptor); HttpParameterBinding[] parameterBindings = actionBinding.ParameterBindings; HttpParameterBinding[] newParameterBindings = new HttpParameterBinding[parameterBindings.Length]; for (int i = 0; i < newParameterBindings.Length; i++) { HttpParameterBinding parameterBinding = parameterBindings[i]; // Itercept FormatterParameterBinding to replace its formatters FormatterParameterBinding formatterParameterBinding = parameterBinding as FormatterParameterBinding; newParameterBindings[i] = formatterParameterBinding != null ? (HttpParameterBinding) new FormatterParameterBindingTracer(formatterParameterBinding, _traceWriter) : (HttpParameterBinding) new HttpParameterBindingTracer(parameterBinding, _traceWriter); } HttpActionBinding newActionBinding = new HttpActionBinding(actionDescriptor, newParameterBindings); return(newActionBinding); }
public void ExecuteBindingAsync_Traces_And_Invokes_Inner_ReadAsync() { // Arrange Mock <HttpParameterDescriptor> mockParamDescriptor = new Mock <HttpParameterDescriptor>() { CallBase = true }; mockParamDescriptor.Setup(d => d.ParameterName).Returns("paramName"); mockParamDescriptor.Setup(d => d.ParameterType).Returns(typeof(string)); FormatterParameterBinding binding = new FormatterParameterBinding(mockParamDescriptor.Object, new MediaTypeFormatterCollection(), null); TestTraceWriter traceWriter = new TestTraceWriter(); FormatterParameterBindingTracer tracer = new FormatterParameterBindingTracer(binding, traceWriter); HttpActionContext actionContext = ContextUtil.CreateActionContext(); actionContext.Request.Content = new StringContent("true"); actionContext.Request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); ModelMetadataProvider metadataProvider = new EmptyModelMetadataProvider(); TraceRecord[] expectedTraces = new TraceRecord[] { new TraceRecord(actionContext.Request, TraceCategories.ModelBindingCategory, TraceLevel.Info) { Kind = TraceKind.Begin, Operation = "ExecuteBindingAsync" }, new TraceRecord(actionContext.Request, TraceCategories.ModelBindingCategory, TraceLevel.Info) { Kind = TraceKind.End, Operation = "ExecuteBindingAsync" } }; // Act Task task = tracer.ExecuteBindingAsync(metadataProvider, actionContext, CancellationToken.None); task.Wait(); // Assert Assert.Equal <TraceRecord>(expectedTraces, traceWriter.Traces, new TraceRecordComparer()); Assert.Equal("True", actionContext.ActionArguments["paramName"]); }
public FormatterParameterBindingTracer(FormatterParameterBinding innerBinding, ITraceWriter traceWriter) : base(innerBinding.Descriptor, innerBinding.Formatters, innerBinding.BodyModelValidator) { _innerBinding = innerBinding; _traceWriter = traceWriter; }