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 のパラメーター オブジェクト プロパティは常に 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 にシリアル化され、割り当てられた値が含まれますが、バイト配列を投稿すると、Web API で常に null になります。

Web APIのクラスのSystem.Xml.Serialization属性と関係があると確信しています。

これを回避する方法について何か提案はありますか? アデ

xsd で生成された My クラスを更新する

/// <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;
        }
    }
}

ウェブ API

[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 に答える