我使用xsd.exe从架构创建了一个类。该类包含System.Xml.Serialization属性。
我已将此类用作web api方法的参数。我需要将参数序列化为xml,以便我可以针对模式进行验证并创建Oracle xmltype。 我的web api方法如下
[HttpPost]
public HttpResponseMessage Create([FromBody]MyClass obj)
我在webapi.config中将默认的Serializer切换到XmlSerializer,如下所示
config.Formatters.XmlFormatter.UseXmlSerializer = true;
从使用HttpWebRequest或WebClient的客户端,我可以成功地序列化(XmlSerializer)类的实例,并使用application / xml内容类型将其发布到web api。到目前为止一切都很好。
但是,如果我尝试发送application / json内容类型,则web api中的参数对象proerties始终为null。参数本身不仅仅是null中的属性。
我按如下方式创建json内容
MyClass data = new MyClass();
// assign some values
string json = new JavaScriptSerializer().Serialize(data);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json);
类的实例序列化为JSON ok并包含赋值,但是,当我发布字节数组时,在web api处始终为null。
我确信它与web api中的类中的System.Xml.Serialization属性有关。
有没有人对如何解决这个问题有任何建议? ADE
更新 我的类用xsd生成
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://Ade.interface")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://Ade.interface", IsNullable = false)]
public partial class MyClass
{
private string nameField;
/// <remarks/>
public string Name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
}
Web api
[HttpPost]
public HttpResponseMessage Create([FromBody]MyClass payload)
{
// payload.Name is null
}
的Fiddler
POST http://myhostname/Create HTTP/1.1
Content-Type: application/json
Host: myhostname
Content-Length: 14
Expect: 100-continue
{"Name":"Ade"}
客户端
string json = new JavaScriptSerializer().Serialize(data);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://myhostname/Create");
request.Method = "POST";
request.ContentLength = bytes.Length;
request.ContentType = "application/json";
try
{
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
// code removed
} catch (WebException we)
{
// code removed
}
答案 0 :(得分:1)
这对我使用Microsoft.AspNet.WebApi.Core的版本=“4.0.20710.0”
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
json.SerializerSettings.ContractResolver = new DefaultContractResolver()
{
IgnoreSerializableInterface = true,
IgnoreSerializableAttribute = true
};
答案 1 :(得分:0)
基于repro,我注意到如果你的请求主体是{"nameField":"Ade"}
,那么Json格式化程序工作正常......
您可以通过修改合同解析程序上的序列化设置来更改此行为。完成此更改后,您应该可以使用{"Name":"Ade"}
示例:
JsonContractResolver resolver = (JsonContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver;
resolver.IgnoreSerializableAttribute = true; // default is 'false'