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); }
/// <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)); }
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); }