// 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);
        }
Exemplo n.º 5
0
        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]);
        }
Exemplo n.º 8
0
        // 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);
        }
Exemplo n.º 9
0
        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;
 }