我使用 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。到目前为止,一切都很好。
但是,如果我尝试发送应用程序/json 内容类型,则 web api 上的参数对象属性始终为空。参数本身不为空,只是其中的属性。
我创建json内容如下
MyClass data = new MyClass();
// assign some values
string json = new JavaScriptSerializer().Serialize(data);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json);
该类的实例可以序列化为 JSON 并包含分配的值,但是,当我发布字节数组时,在 web api 上始终为空。
我确信这与 web api 类中的 System.Xml.Serialization 属性有关。
有人对如何解决这个问题有任何建议吗?阿德
更新我用 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;
}
}
}
网页接口
[HttpPost]
public HttpResponseMessage Create([FromBody]MyClass payload)
{
// payload.Name is null
}
提琴手
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
}