Beispiel #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);
        }
Beispiel #2
0
        /// <inheritdoc />
        public override Task ExecuteResultAsync(ActionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            var services = context.HttpContext.RequestServices;
            IXmlResultExecutor executor    = null;
            string             serviceName = string.Empty;

            switch (XmlSerializerType)
            {
            case XmlSerializerType.XmlSeriralizer:
                executor    = services.GetService <XmlResultExecutor>();
                serviceName = "XmlSerializerFormatterServices";
                break;

            case XmlSerializerType.DataContractSerializer:
                executor    = services.GetService <XmlDcResultExecutor>();
                serviceName = "XmlDataContractSerializerFormatterServices";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(XmlSerializerType));
            }
            if (executor == null)
            {
                var loggerFactory = services.GetRequiredService <ILoggerFactory>();
                var logger        = loggerFactory.CreateLogger <XmlResult>();
                // No formatter supports this.
                logger.NoExecutor(XmlSerializerType.ToString());
                context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable;
#if DEBUG
                var msg = Resources.XmlFromater_WasNotSetup_To_Mvc(serviceName);
                context.HttpContext.Response.ContentType = "text/html";
                MvcXmlLoggerExtensions.StringToHttpContext(context.HttpContext, msg);
#endif
                return(Task.FromResult(0));
            }

            return(executor.ExecuteAsync(context, this));
        }
Beispiel #3
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);
        }