簡體   English   中英

從HttpRequest反序列化在Web API中無法正常工作

[英]Deserialize from HttpRequest not working correctly in web api

我有一個自定義模型活頁夾,以從來自FormData應用程序的FormData中獲取一些值。 除了一個特定的屬性: TenantDomainUrl其他所有東西都可以正常工作。 進行反序列化時,即使在請求中發送了該值,該值也設置為null

圖片1 :(就在發送請求之前,請檢查控制台:

在此處輸入圖片說明

自定義模型聯編程序代碼是這樣的:

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

反序列化后的第二張圖片

在此處輸入圖片說明

我認為我實際上不需要發布REACT JS代碼

更新:

readasstring使用值正確返回json,但是反序列化后該屬性為null:

在此處輸入圖片說明

更新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);
        }
    }

由於JsonProperty它不會從TenantDomainUrl JSON值中讀取,而是從id讀取。

[JsonProperty("id")]

刪除屬性,或更改發布的JSON

UPDATE

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

 "id":null

參考之前關於該主題的文章,請確保通過您的FormData傳遞此id並帶有鍵id和值集,如下所示。

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

編輯:

如果[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 */}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM