2016-10-07 10 views
3

私は、オブジェクトを受け入れるPOSTメソッドを持つ単純なWeb APIコントローラを持っています。クライアントがJSONとしてデータを投稿すると、APIは正常に動作します。データはencoding="utf-8"XMLとして送信された場合でも、モデルがシームレスに結合しWeb APIはutf-16でエンコードされたXMLを使用してPOST用のモデルをバインドできません

以下
config.Formatters.XmlFormatter.UseXmlSerializer = true; 

は私ApiControllerです(私はXml Serialization代わりDataContractの使用WebApiConfigに次の行を追加している):

public class InfoController : ApiController 
{ 
    public HttpResponseMessage Post(InfoRequest infoRequest) 
    { 
     //do work and return something 
     return Request.CreateResponse(HttpStatusCode.Accepted, infoRequest != null); 
    } 
} 

付きタイプ

public class InfoRequest 
{ 
    public string Id { get; set; } 
    public int Total { get; set; } 
    public Status Status { get; set; } 
} 

public enum Status 
{ 
    None = 0, 
    Confirmed, 
    Cancelled 
} 

ここで、クライアントがda TA、それは

Content-Type: application/json 
body: 
{ 
    "Id": "ACARG021", 
    "Total": 20, 
    "Status": "Confirmed" 
} 

これは

Content-Type: application/xml 
body: 
<?xml version="1.0" encoding="utf-8"?> 
<InfoRequest> 
    <Id>ACARG021</Id> 
    <Total>20</Total> 
    <Status>Confirmed</Status> 
</InfoRequest> 

しかし

だけでなく、正常に動作し正常に動作し、XMLを UTF-16に掲載されたときにモデルバインディングが失敗し、コントローラのメソッドは nullを取得それに渡された。他のいくつかのSOの記事で示唆したように

Content-Type: application/xml; charset=utf-16 
//Accept-Charset: utf-16 //Edit: wrong header, removed 
body: 
<?xml version="1.0" encoding="utf-16"?> 
<InfoRequest> 
    <Id>ACARG021</Id> 
    <Total>20</Total> 
    <Status>Confirmed</Status> 
</InfoRequest> 

WebApiConfigにこれを追加すると、これは、箱から出して動作するはずサーバー側で

Encoding utf16 = Encoding.GetEncoding("utf-16"); 
config.Formatters.XmlFormatter.SupportedEncodings.Add(utf16); 
+0

デフォルトのjsonエンコーディングをリセットしてみましたか? https://blogs.msdn.microsoft.com/henrikn/2012/04/22/asp-net-web-api-content-negotiation-and-accept-charset/ –

答えて

0

を助けていません。だから私は問題があなたのPOSTになると思う。コンテンツタイプヘッダーには正しいエンコーディングが必要です。 XML自体のヘッダーをencoding = "utf-16"に変更するだけでは不十分です。 試してみてください。

Content-Type: application/xml; charset=utf-16 

また、実際にはヘッダーを変更しないことエンコーディングでデータを送信する必要があります。

+0

回答ありがとうございます。しかし、ヘッダーに文字セットを記述することはあまり役に立ちません。 Web APIはまだそれをデコードできません。 –

+0

POSTをどのように行うことができますか? UTF-8に変更することはできませんか? UTF-16では、TCP/IPを介して転送されるデータ量が2倍になります。 – Honza

+0

今のところ(テストのため)私は質問で言及したのとまったく同じデータ/ヘッダーでPostmanクライアントを使って投稿しています。私はここのサービスを所有しています。クライアントではありません。 'UTF-16'はクライアントの特定の要件ですので、変更することはできません。私はそれがデータサイズを増やすことを知っていますが、今のところそれを稼働させる必要があります。 –

関連する問題