从WCF REST通用请求获取特定于类型的响应?

时间:2011-02-03 17:27:05

标签: c# json generics serialization

我正在设计WCF REST服务。设计的要求是 客户不知道给定请求的细节。例如, 以下要求:

https://www.domain.com/dashboard/group/id/0

会回来:

Request: GetGroup(GroupId = 0)
Response: 
{
Title="Country",
children = 
{
title="USA", Id=1, type=GROUP},
{title="England", Id=2, type=GROUP}
}
}

以下要求:

https://www.domain.com/dashboard/group/id/3

会回来:

Request: GetGroup(groupId = 3)
Response: 
{
Title="Customers",
children = 
{
title="General Motors", Id=1, type=CUSTOMER},
{title="General Electric", Id=2, type=CUSTOMER}
}
}

我的问题如何获取通用REST请求并返回特定类型的响应?

在我的项目中,有一些类型将在JSON响应中序列化。序列化对象取决于传入的groupId参数。他们是:

GROUP
CUSTOMER
FACILITY
TANK

在相关文章中,有人建议我创建一个公开GetGroupById的基类 以上类应该重写基类方法。如果这听起来很好 如何解决这个问题的例子,我很欣赏一个例子。或者,或者,其他建议。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您始终可以创建一个返回Stream的服务,并使用JsonSerializer将对象序列化为MemoryStream,然后从服务中返回MemoryStream

public Stream GetSomeObject(int groupId)
{
    byte[] bytes;
    var serializer = new JavaScriptSerializer();

    switch(groupId)
    {
        case 2:
            var groups = GetGroups(); // fill the groups however
            bytes = Encoding.UTF8.GetBytes(serializer.Serialize(groups));
            break;
        case 3:
            var customers = GetCustomers();
            bytes = Encoding.UTF8.GetBytes(serializer.Serialize(customers));
            break;
    }

    return new MemoryStream(bytes);
}

在这种情况下,您只需根据参数将适当的对象加载到内存中,并通过Stream返回相应的强类型对象。

这与我过去用来从WCF服务返回没有类型信息的Json结果的方法相同(该方法是由Microsoft的WCF团队成员提出的,所以我认为它相当可靠)。