0

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

2 回答 2

1

这对我使用 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
}; 
于 2013-11-14T07:38:28.780 回答
0

根据重现,我注意到如果您的请求正文相当,Json 格式化程序可以正常工作{"nameField":"Ade"}......

您可以通过修改合约解析器上的序列化设置来更改此行为。进行此更改后,您应该可以使用{"Name":"Ade"}

例子:

JsonContractResolver resolver = (JsonContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver;
resolver.IgnoreSerializableAttribute = true; // default is 'false'
于 2013-11-13T19:54:35.557 回答