使用ravendb id的ServiceStack路由

Chr*_*ris 9 rest ravendb servicestack

我有一个ID为的实体

public string ID {get;set;}    
activities/1
Run Code Online (Sandbox Code Playgroud)

(来自RavenDB).

我在ServiceStack AppHost中注册了以下路由

Routes
    .Add<Activity>("/activities")
    .Add<Activity("/activities/{id}");
Run Code Online (Sandbox Code Playgroud)

我正在使用骨干应用程序POST和PUT到我的REST服务.

开箱即用的事情:

  • id属性被序列化为json,作为"activities/1"
  • id属性被编码为"活动%2F1"的路由
  • ServiceStack优先于基于URL的id属性,因此我的字符串获取的编码值对RavenDb没有用处.

我知道的选项:

  • 更改主干以发布到"/ activities"并让JSON Serialiser启动
  • 更改RavenDb ID生成以使用连字符而不是斜杠
  • 使我的Id属性在集合上解析为编码的%2F并转换为斜杠

两者都有缺点,我要么在我的API中丢失RESTful,这是不可取的,或者我不遵循RavenDb约定,这通常是明智的狐狸.另外,我个人喜欢使用斜杠.

所以我想知道在servicestack中是否还有其他选项我可以用来解决这个涉及较少妥协的问题?无论是Serialiser定制还是通配路由都在我脑海中......

Mat*_*int 10

我对ASP.Net WebAPI也有同样的问题,所以我认为这不是一个ServiceStack问题,而是在REST URL上处理Raven样式id的一般问题.

例如,假设我查询GET: /api/users并返回如下结果:

[{
  Id:"users/1",
  Name:"John"
},
{
  Id:"users/2",
  Name:"Mary"
}]
Run Code Online (Sandbox Code Playgroud)

现在我想得到一个特定的用户.如果我遵循纯REST方法,将从该文档中收集Id,然后我将其传递给url的id部分.这里的问题是,这最终看起来 GET: /api/users/users/1不仅令人困惑,而且斜杠阻碍了WebAPI(和ServiceStack)如何将url参数路由到action方法.

我做的妥协是仅从URL的角度将id视为整数.所以客户端调用GET: /api/users/1,我将我的方法定义为public User Get(int id).

很酷的部分是Raven的session.Load(id)重载可以是完整的字符串形式,也可以是整数形式,所以你不必在大部分时间翻译.

如果您发现自己需要翻译id,可以使用此扩展方法:

public static string GetStringIdFor<T>(this IDocumentSession session, int id)
{
  var c = session.Advanced.DocumentStore.Conventions;
  return c.FindFullDocumentKeyFromNonStringIdentifier(id, typeof (T), false);
}
Run Code Online (Sandbox Code Playgroud)

调用它很简单session.GetStringIdFor<User>(id).我通常只需要手动翻译,如果我正在使用id而不是立即加载文档.

我理解通过翻译这样的ID,我打破了一些REST纯粹主义惯例,但我认为这是合情合理的.我会对任何人提出的替代方法感兴趣.