OpenRasta通过JsonDataContractCodec返回列表

时间:2010-09-22 13:47:30

标签: c# openrasta

假设我有如下资源:

namespace OpenRastaApp.Resources
{
    public class Foo
    {
        public string Bar { get; set; }
    }
}

像:

这样的处理程序
namespace OpenRastaApp.Handlers
{
    public class FooHandler
    {
        public object GetAll()
        {
            ArrayList foos = new ArrayList();
            foos.Add(new Foo() { Bar = "Hello," });
            foos.Add(new Foo() { Bar = " world!" });
            List<Foo> result = new List<Foo>(foos.ToArray(typeof(Foo)) as Foo[]);
            return result;
        }
        public object Get(int id)
        {
            return new Foo() { Bar = "Baz" };
        }
    }
}

和配置为:

namespace OpenRastaApp
{
    public class Configuration : IConfigurationSource
    {
        public void Configure()
        {
            using (OpenRastaConfiguration.Manual)
            {
                ResourceSpace.Has.ResourcesOfType<Foo>()
                    .AtUri("/foos")
                    .And.AtUri("/foos/{id}")
                    .HandledBy<FooHandler>()
                    .AsJsonDataContract();
            }
        }
    }
}

/ foos / 1按预期渲染:

{"Bar":"Baz"}
然而,/ foos根本没有渲染。调试控制台显示消息“8- [2010-09-22 13:39:29Z]信息(0)未搜索响应编解码器。响应实体为空或已设置响应编解码器。”我在返回之前已经验证结果是非null。我也试过返回一个Foo [],但是也有同样的错误。

2 个答案:

答案 0 :(得分:3)

想出来。必须按如下方式修改我的配置:

namespace OpenRastaApp
{
    public class Configuration : IConfigurationSource
    {
        public void Configure()
        {
            using (OpenRastaConfiguration.Manual)
            {
                ResourceSpace.Has.ResourcesOfType<List<Foo>>()
                    .AtUri("/foos")
                    .HandledBy<FooHandler>()
                    .AsJsonDataContract();
                ResourceSpace.Has.ResourcesOfType<Foo>()
                    .AtUri("/foos/{id}")
                    .HandledBy<FooHandler>()
                    .AsJsonDataContract();
            }
        }
    }
}

答案 1 :(得分:0)

仅供参考,你也可以做到以下几点:

ResourceSpace.Has.ResourcesOfType<Foo>()
    .AtUri("/foos/{id}")
    .HandledBy<FooHandler>()
    .AsJsonDataContract();
ResourceSpace.Has.ResourcesOfType<List<Foo>>()
    .WithoutUri
    .AsJsonDataContract();