Вы можете использовать JsonReturnBinder для этого:
[return:JSonReturnBinder]
public object Note(string id)
{
if (!string.IsNullOrEmpty(id))
{
if (notesProvider.HasNote(id))
{
return new {status=200, text= notesProvider.GetNote(id).Body };
}
else return new {status=404, text="Could not find the Note by provided id [" + id + "]" };
}
else return new {status =500, text="Illegal request : a note id must be provided" };
}
Предложение уточнения:
Зачем возвращать код состояния как часть тела ответа? в любом ответе есть поле HttpStatusCode. Установка его в желаемом коде облегчит использование клиентского кода (вы можете проверить код состояния в XMLHttpRequest напрямую, и большинство библиотек JS имеют выделенные обработчики для успеха и ошибок), плюс ваш метод вернет нужную строку, поэтому Unit Testing было бы намного проще. Пример:
[return:JSonReturnBinder]
public string Note(string id)
{
if (!string.IsNullOrEmpty(id))
{
if (notesProvider.HasNote(id))
{
return notesProvider.GetNote(id).Body;
}
else
{
Response.StatusCode = 404;
return "Could not find the Note by provided id [" + id + "]";
}
}
else
{
Response.StatusCode = 500;
return "Illegal request : a note id must be provided";
}
}
Еще одно предложение - перетасовать блоки if / else, чтобы уменьшить уровни вложенности:
[return:JSonReturnBinder]
public string Note(string id)
{
if (string.IsNullOrEmpty(id))
{
Response.StatusCode = 500;
return "Illegal request : a note id must be provided";
}
if (notesProvider.HasNote(id) == false)
{
Response.StatusCode = 404;
return "Could not find the Note by provided id [" + id + "]";
}
return notesProvider.GetNote(id).Body;
}
Таким образом, код начинается с гарантий (предварительных условий), а последний оператор возврата в методе представляет завершение нормального выполнения. ИМО облегчает чтение.