Esempio n. 1
0
        public void Create_FromXmlBodyAttribute(XmlSerializerType xmlSerializerType, bool useXmlBinderOnly, Type expectedType)
        {
            // Act
            var att = new FromXmlBodyAttribute()
            {
                XmlSerializerType = xmlSerializerType,
                UseXmlBinderOnly  = useXmlBinderOnly
            };

            //Assert

            Assert.Equal(expectedType, att.BinderType);
            Assert.Equal(BindingSource.Body, att.BindingSource);
        }
Esempio n. 2
0
        public async void BindTheXmlBodyToTheParameterValue(XmlSerializerType xmlSerializerType, bool useXmlBinderOnly)
        {
            // Arrange
            byte[] bodyRequestContext = new byte[0];

            var value             = new PurchaseOrder();
            var xmlWriterSettings = FormattingUtilities.GetDefaultXmlWriterSettings();

            xmlWriterSettings.CloseOutput = false;
            var textw  = new StringWriter();
            var writer = XmlWriter.Create(textw, xmlWriterSettings);

            if (xmlSerializerType == XmlSerializerType.XmlSeriralizer)
            {
                var xmlSerializer = new XmlSerializer(value.GetType());
                xmlSerializer.Serialize(writer, value);
                bodyRequestContext = Encoding.UTF8.GetBytes(textw.ToString());
            }
            else
            {
                var xmlSerializer = new DataContractSerializer(value.GetType());
                xmlSerializer.WriteObject(writer, value);
                writer.Flush();
                bodyRequestContext = Encoding.UTF8.GetBytes(textw.ToString());
            }

            var att = new FromXmlBodyAttribute()
            {
                XmlSerializerType = xmlSerializerType,
                UseXmlBinderOnly  = useXmlBinderOnly
            };
            var attList = new List <object>()
            {
                att
            };
            var bindingInfo = BindingInfo.GetBindingInfo(attList);

            var parameterDescriptor = new ParameterDescriptor
            {
                Name          = "value",
                ParameterType = typeof(PurchaseOrder),
                BindingInfo   = bindingInfo
            };

            var actionDescriptor = new ActionDescriptor()
            {
                Parameters = new List <ParameterDescriptor>()
                {
                    parameterDescriptor
                }
            };

            var actionContext = GetActionContext(actionDescriptor);

            actionContext.HttpContext.Request.Body.Write(bodyRequestContext, 0, bodyRequestContext.Length);
            actionContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);

            ServiceCollection services = CreateServices();
            var servicesProvider       = services.BuildServiceProvider();

            actionContext.HttpContext.RequestServices = servicesProvider;
            var metadataProvider = new TestModelMetadataProvider();

            metadataProvider.ForType(parameterDescriptor.ParameterType).BindingDetails
            (
                (b) =>
            {
                b.BindingSource = BindingSource.Body;
                b.BinderType    = att.BinderType;
            }
            );

            ModelMetadata parameterModelMetadata = metadataProvider.GetMetadataForType(parameterDescriptor.ParameterType);

            var original = CreateDefaultValueProvider();

            //*1
            ModelBindingContext modelBindingContext = DefaultModelBindingContext.CreateBindingContext(
                actionContext,
                original,
                parameterModelMetadata,
                parameterDescriptor.BindingInfo,
                "model");

            //*2
            ModelBinderProviderContext    modelBinderProviderContext    = new TestModelBinderProviderContext(parameterModelMetadata, parameterDescriptor.BindingInfo, metadataProvider);
            BinderTypeModelBinderProvider binderTypeModelBinderProvider = new BinderTypeModelBinderProvider();

            // Act
            var binderforType = binderTypeModelBinderProvider.GetBinder(modelBinderProviderContext);

            // Assert
            Assert.NotNull(binderforType);
            await binderforType.BindModelAsync(modelBindingContext);

            var newValue = modelBindingContext.Result.Model as PurchaseOrder;

            Assert.NotNull(newValue);
            Assert.Equal(value.billTo.street, newValue.billTo.street);
            Assert.Equal(value.shipTo.street, newValue.shipTo.street);
        }