使用包含System.Xml.Serialization属性的类时,web api调用中的空参数

时间:2013-11-13 15:27:47

标签: asp.net-web-api

我使用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           
    }

2 个答案:

答案 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'