从 HttpRequest 反序列化在 Web 中无法正常工作 api
Deserialize from HttpRequest not working correctly in web api
我有一个自定义模型活页夹,可以从 FormData
中获取一些来自 React 应用程序的值。除了一个特定的 属性: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;
}
}
以及反序列化后的第2张图片
我认为我实际上不需要 post REACT JS 代码
更新:
readasstring returns json 的值正确,但反序列化后 属性 为空:
更新 2,租户 class
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
。
更新
在你上面的第一张图片中,我注意到
"id":null
参考关于此主题的 ,请确保通过您的 FormData
使用键 id
和值集传递此 id
,类似于此处下面。
data.append("model", JSON.stringify({ "id": "your-id-goes-here" }}
编辑:
如果[JsonProperty("id")]
必须留在TenantDomainUrl,您需要将JSON您post更改为此端点以获得密钥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 */}
我有一个自定义模型活页夹,可以从 FormData
中获取一些来自 React 应用程序的值。除了一个特定的 属性: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;
}
}
以及反序列化后的第2张图片
我认为我实际上不需要 post REACT JS 代码
更新:
readasstring returns json 的值正确,但反序列化后 属性 为空:
更新 2,租户 class
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
。
更新
在你上面的第一张图片中,我注意到
"id":null
参考关于此主题的 FormData
使用键 id
和值集传递此 id
,类似于此处下面。
data.append("model", JSON.stringify({ "id": "your-id-goes-here" }}
编辑:
如果[JsonProperty("id")]
必须留在TenantDomainUrl,您需要将JSON您post更改为此端点以获得密钥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 */}