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

Asp.net web api 使用包含System.Xml.Serialization属性的类时,web api调用中的Null参数,asp.net-web-api,Asp.net Web Api,我已经使用xsd.exe从架构创建了一个类。此类包含System.Xml.Serialization属性 我使用这个类作为web api方法的参数。我需要将参数序列化为xml,以便根据模式进行验证并创建Oracle xmltype。 我的WebAPI方法如下 [HttpPost] public HttpResponseMessage Create([FromBody]MyClass obj) config.Formatters.XmlFormatter.UseXmlSerializer = t

我已经使用xsd.exe从架构创建了一个类。此类包含System.Xml.Serialization属性

我使用这个类作为web api方法的参数。我需要将参数序列化为xml,以便根据模式进行验证并创建Oracle xmltype。 我的WebAPI方法如下

[HttpPost]
public HttpResponseMessage Create([FromBody]MyClass obj)
config.Formatters.XmlFormatter.UseXmlSerializer = true;
MyClass data = new MyClass();
// assign some values
string json = new JavaScriptSerializer().Serialize(data);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json);
我在webapi.config中将默认序列化程序切换为XmlSerializer,如下所示

[HttpPost]
public HttpResponseMessage Create([FromBody]MyClass obj)
config.Formatters.XmlFormatter.UseXmlSerializer = true;
MyClass data = new MyClass();
// assign some values
string json = new JavaScriptSerializer().Serialize(data);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json);
从使用HttpWebRequest或WebClient的客户端,我可以成功序列化(XmlSerializer)该类的一个实例,并使用application/xml内容类型将其发布到web api。到目前为止还不错

但是,如果我尝试发送application/json内容类型,那么web api上的参数object proerties始终为null。参数本身不是空的,只是其中的属性

我创建json内容如下

[HttpPost]
public HttpResponseMessage Create([FromBody]MyClass obj)
config.Formatters.XmlFormatter.UseXmlSerializer = true;
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属性有关

有人对如何避开这一点有什么建议吗? 艾德

更新 我的类是用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;
        }
    }
}
小提琴手

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           
    }

基于repo,我注意到如果您的请求主体是
{“nameField”:“Ade”}
,那么Json格式化程序工作得很好

您可以通过修改协定解析程序上的序列化设置来更改此行为。更改后,您应该能够使用
{“Name”:“Ade”}

例如:

JsonContractResolver resolver = (JsonContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver;
resolver.IgnoreSerializableAttribute = true; // default is 'false'

这在使用Microsoft.AspNet.WebApi.Core的version=“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
}; 

您是否检查了模型状态是否有任何错误<代码>如果(!ModelState.IsValid){抛出新的HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest,this.ModelState));}模型状态为true。parameter对象中的属性均为null,而不是参数本身。您能否共享您的请求的外观以及您的类型?很遗憾,我无法发送类内容。我将尝试一个简单的例子,稍后在这里发布我在上面发布了一个更新。JsonContractResolver属于哪个程序集?我正在使用VS2010 Framework 4。我无法在System.Net.formatting中解析它。我没有System.Net.formatting。我有一个system.net.http.formatting。如果我使用它,我会得到以下错误“System.Net.Http.Formatting.JsonContractResolver”由于其保护级别而无法访问抱歉,这是一个输入错误..我实际上是指“System.Net.Http.Formatting”…当此合约解析程序不是公共的时,您似乎正在使用旧版本的Web API…只是在另一台开发机器framework 4.5和VS2012仍然是相同的错误。Web API不是框架的一部分吗?如果不是,如何更新Web API版本?