AngularJS Resource モジュールで servicestack を使用しています。問題は、サービスの query() メソッドを呼び出してページ分割されたリストを要求するときに、行の総数を含むカスタム応答ヘッダーを送信したいことです。
http 応答を次のようにしたいと思います。
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
X-Total-Rows: 14
X-Powered-By: ServiceStack/3,958 Win32NT/.NET
Content-Length: 831
[{"id":11,"content":"Item 10","dueDate":"2013-10-17T00:00:00.0000000","priority":9},
{"id":13,"content":"Item 12","dueDate":"2013-06-16T00:00:00.0000000","priority":9},
{"id":20,"content":"Item 19","dueDate":"2013-04-06T00:00:00.0000000","priority":9},
{"id":32,"content":"Item 31","dueDate":"2013-01-21T00:00:00.0000000","priority":9},
{"id":42,"content":"Item 41","dueDate":"2013-05-16T00:00:00.0000000","priority":9},
{"id":19,"content":"Item 18","dueDate":"2013-07-14T00:00:00.0000000","priority":8},
{"id":15,"content":"Item 14","dueDate":"2013-03-06T00:00:00.0000000","priority":7},
{"id":12,"content":"Item 11","dueDate":"2013-02-23T00:00:00.0000000","priority":4},
{"id":18,"content":"Item 17","dueDate":"2013-10-21T00:00:00.0000000","priority":3},
{"id":14,"content":"Item 13","dueDate":"2013-01-11T00:00:00.0000000","priority":2}]
とりあえず、これを行うために、次の DTO を使用します。
[Route("/todos", Verbs = "GET")]
public class Todos : IReturn<List<Todo>>
{
[DataMember(Name = "q")] public string Query { get; set; }
[DataMember(Name = "sort")] public string Sort { get; set; }
[DataMember(Name = "desc")] public bool IsDesc { get; set; }
[DataMember(Name = "limit")] public int? Limit { get; set; }
[DataMember(Name = "offset")] public int Offset { get; set; }
}
[Route("/todos", Verbs = "POST")]
[Route("/todos/{Id}", Verbs = "GET,PUT,DELETE")]
public class Todo : IReturn<Todo>
{
public int Id { get; set; }
public string Content { get; set; }
public DateTime? DueDate { get; set; }
public int? Priority { get; set; }
}
そしてサービスで:
public object Get(Todos request)
{
long count;
var items = _repository.GetAll(request.Query, request.Sort, request.IsDesc, request.Limit, request.Offset, out count);
Response.AddHeader("X-Total-Rows", count.ToString(CultureInfo.InvariantCulture));
return items.Select(Mapper.Map<TodoItem, Todo>).ToList();
}
servicestack でやりたいことは、ResponseDTO でカスタム属性を使用して、一部のプロパティを応答ヘッダーでシリアル化し、他のプロパティを応答本文でシリアル化することを示すことです。応答 DTO は次のようになります。
public class TodosResponse
{
[Header(Name = "X-Total-Rows")] public int TotalRows { get; set; }
[Body] public List<Todo> Todos { get; set; }
}
サービスは次のような応答を作成します。
public object Get(Todos request)
{
long count;
var items = _repository.GetAll(request.Query, request.Sort, request.IsDesc, request.Limit, request.Offset, out count);
return new TodosResponse
{
TotalRows = count,
Todos = items.Select(Mapper.Map<TodoItem, Todo>).ToList()
};
}
そしてもちろん、HTTP 応答は上記とまったく同じように見えます。
だから私の質問は: カスタム属性でこれを達成することは可能ですか?