从HttpRequest反序列化在Web API中无法正常工作

时间:2018-07-25 20:38:04

标签: c# asp.net .net asp.net-web-api asp.net-web-api2

我有一个自定义模型联编程序,可以从FormData中获取一些来自React应用程序的值。除了一个特定的属性TenantDomainUrl之外,其他所有东西都工作正常。反序列化发生时,即使在请求中发送了该值,该值也设置为null

图片1 :(在发送请求之前,请检查控制台:

enter image description here

自定义模型联编程序代码是这样的:

public class TenantModelBinder : IModelBinder
    {
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.ModelType != typeof(Tenant))
            {
                return false;
            }

            var task = Task.Run(async () =>
            {
                var model = new Tenant();

                if (!actionContext.Request.Content.IsMimeMultipartContent())
                {
                    bindingContext.ModelState.AddModelError(bindingContext.ModelName, "WebRequeest content 'multipart/form-data' is valid");
                }
                else
                {
                    var provider = await actionContext.Request.Content.ReadAsMultipartAsync();

                    //var fileContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals("file"));
                    var fileContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals(@"""file"""));
                    if (fileContent == null)
                    {
                        bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Section 'file' is missed");
                    }

                    //var modelContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals("model"));
                    var modelContent = provider.Contents.FirstOrDefault(n => n.Headers.ContentDisposition.Name.Equals(@"""model"""));
                    if (modelContent == null)
                    {
                        bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Section 'model' is missed");
                    }

                    if (fileContent != null && modelContent != null)
                    {
                        model = JsonConvert.DeserializeObject<Tenant>(
                            await modelContent.ReadAsStringAsync());

                        model.CertificateFile = fileContent.ReadAsByteArrayAsync().Result;
                    }
                }

                return model;
            });

            task.Wait();

            bindingContext.Model = task.Result;
            return true;
        }
    }

反序列化后的第二张图片

enter image description here

我认为我实际上不需要发布REACT JS代码

更新:

readasstring使用值正确返回json,但是反序列化后该属性为null:

enter image description here

更新2,租户类别

public class Tenant
    {
        [JsonProperty("id")]
        public string TenantDomainUrl { get; set; }

        public string ApplicationId { get; set; }

        public string SiteCollectionTestUrl { get; set; }

        public string CertificatePassword { get; set; }

        public byte[] CertificateFile { get; set; }


        public Uri CertificatePath { get; set; }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(this);
        }
    }

2 个答案:

答案 0 :(得分:2)

由于JsonProperty不会从TenantDomainUrl JSON值读取,而是从id读取。

[JsonProperty("id")]

删除属性,或更改发布的JSON

更新

在上面的第一张照片中,我注意到

 "id":null

请参考此主题上的previous post,请确保通过键id和设置的值通过FormData传递此id,如下所示。

data.append("model", JSON.stringify({ "id": "your-id-goes-here" }} 

答案 1 :(得分:1)

编辑:

如果[JsonProperty("id")]必须保留在 TenantDomainUrl 上,则需要更改发布到此终结点的JSON,使其具有键 id 而不是 TenantDomainUrl 。像这样

{"id":"cm.microsoft.com","ApplicationId":"a21-fan-...", /* other properties in your JSON */}

代替

{"TenantDomainUrl":"cm.microsoft.com","ApplicationId":"a21-fan-...", /* other properties in your JSON */}