2010-09-22 39 views
3

返回列表假设我有一个资源象下面这样:OpenRasta通过JsonDataContractCodec

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)未搜索到响应编解码器,响应实体为空或已设置响应编解码器。我已经验证结果在返回之前是非空的。我也尝试过返回一个Foo [],但是它有同样的错误。

回答

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(); 
      } 
     } 
    } 
}
+6

是的,我们确实应该更新的文档。事物和事物清单是两种不同的资源。我们至少应该有一个警告/调试信息让人们知道 – SerialSeb 2010-09-24 01:08:29

+0

另一种选择是在任一情况下使用列表。至少,我已经开始了这条道路。 – pc1oad1etter 2010-10-01 16:36:44

+0

启动seb的某种配置分析阶段?它可能会输出'我有什么'信息和uri的内部调试以及每种类型支持的媒体类型? – Psiren 2011-06-17 15:20:51

0

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

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