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
}