2014-03-20 4 views
2

Я пытаюсь выяснить способ возврата пользовательской полезной нагрузки с кодом возврата 200 вместо ASP.NET WebApi. В основном я хочу, чтобы иметьHttpError с пользовательской полезной нагрузкой в ​​WebApi

{"status":{"code":"40001", "message": "Field XXX can not be empty"}} 

и

<status><code>40001</code><message>Field XXX can not be empty</message></status> 

Я делаю это с помощью HttpError класса, добавив Dictionary с rerquired полезной нагрузки. Он отлично работает для JSON, но не подходит для XML, и, как я понимаю, это сводится к XmlSerializer и HttpError, не играя красиво.

Вот короткий фрагмент кода, чтобы точно воспроизвести ту же ошибку:

var error = new HttpError(); 
var status = new Dictionary<string, string> 
{ 
    {"code", "40001"}, 
    {"text", "Field XXX can not be empty"} 
}; 
error.Add("status", status); 
var ser = new XmlSerializer(error.GetType()); 
StringWriter strWriter = new StringWriter(); 
ser.Serialize(strWriter, error); 

В этом случае я получаю Xml type 'xdt:untypedAtomic' does not support a conversion from Clr type 'KeyValuePair 2' to Clr type 'String'

Следующим шагом является понять, что KeyValuePair не serializeable, и создать отдельный класс :

[XmlType(TypeName="Status")] 
public class ResponseStatus 
{ 
    public ResponseStatus(){} 
    public String Code 
    { get; set; } 

    public String Text 
    { get; set; } 
} 

, который сам по себе сериализуется просто отлично, но бросает такое же исключение, если используется внутри HttpError: Xml type 'List of xdt:untypedAtomic' does not support a conversion from Clr type 'ResponseStatus' to Clr type 'String'.

Я не верю, что никто этого не делал раньше, поэтому мне интересно, чего мне не хватает?

ответ

0

Вы также можете сделать это таким образом;

HttpError err = new HttpError(); 
err["code"] = "40001"; 
err["text"] = "Field XXX can not be empty"; 

затем вернуть его через HttpResponseMessage на то есть на уровне контроллера

return Request.CreateResponse(HttpStatusCode.--, err); 

Для вас, чтобы вернуться { "статус": { "код": "40001", "сообщение": «Поле XXX может не может быть пустым "}}, вы, возможно, придется создать сложный тип IE

public class ResponseStatus 
{ 
    public Status status { get; set; } 
} 

public class Status 
{ 
    public string code { get; set; } 
    public string message { get; set; } 
} 

, а затем создать экземпляр два класса из произнесите контроллера т.е.

Status st = new Status(); 
st.code = "40001"; 
st.message = "Field XXX can not be empty"; 

ResponseStatus responsStatus = new ResponseStatus(); 
responsStatus.status = st; 
return Request.CreateResponse(HttpStatusCode.OK, responsStatus); 

Чтобы получить больше контроля над своим выпуском, рассмотрите возможность украшения ваших классов DataContract и DataMember. из этих пространств имен System.ComponentModel.DataAnnotations и использование System.Runtime.Serialization т.е.

[DataContract] 
class Status 
{ 
     [DataMember(Name = "code")] 
     public string code { get; set; } 
     [DataMember(Name = "message")] 
     public string message { get; set; } 
} 
+0

Хорошо, я модифицировал начальный вопрос. Сериализация строк работает, но мне нужны эти ключи, которые можно обернуть в поле «статус». В этом случае сериализация не выполняется –

Смежные вопросы