Servicestack冲突路线?

时间:2014-03-28 08:58:05

标签: rest routing servicestack

我有以下请求对象:

[Route("/Model/Blah/BySlug/{Slug}/", "GET")]
[Route("/Model/Blah/ByBlahSeriesId/{SomeOtherId}/", "GET")]
[Route("/Model/Blah/ById/{Id}/", "GET")]
public class GetBlahRequest : Blah, IReturn<BlahResponse>
{
    public int Start { get; set; }
    public int Limit { get; set; }

}

[Route("/Model/Blah/", "POST")]
public class PostBlahRequest : Blah, IReturn<BlahResponse>
{

}

[Route("/Model/Blah/", "PUT")]
public class PutBlahRequest : Blah, IReturn<BlahResponse>
{

}

我被告知在GET上有相互矛盾的路线?

怎么会这样?他们是非常不同的。调用get的代码是:

 var blahResult = _client.Get(new GetBlahRequest
            {
                Id = model.BlahId
            });

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

你确实有冲突。因为GetBlahRequest DTO在使用Blah进行扩展时相当于:

public class GetBlahRequest
{
    public int Id { get; set; }
    public int BlahSeriesId { get; set; }
    public string Slug { get; set; }
    public int Start { get; set; }
    public int Limit { get; set; }
}

当客户端尝试使用{ Id = 123 }发出请求时,它无法知道要选择哪3条路线。如果BlahSeriesId不可为空(int?),则默认为0Slug默认为null,但会被视为空。它有效地看到了这三条路线:

/Model/Blah/BySlug//
/Model/Blah/ByBlahSeriesId/0/
/Model/Blah/ById/123/

虽然在这种情况下,它显然应该选择最后一条路线,但客户端确实警告您可以指定SlugId的情况,根据您的DTO完全有效,并想到了啊!

GetBlahRequest
{
    Id = 123,
    Slug = "Something"
}

会产生三种可能的路线:

/Model/Blah/BySlug/Something/
/Model/Blah/ByBlahSeriesId/0/
/Model/Blah/ById/123/

虽然这是一项更多的工作,但路线应该以更清晰的意图分离到DTO。

public class GetBlahRequest : Blah
{
    public int Start { get; set; }
    public int Limit { get; set; }
}

[Route("/Model/Blah/ById/{Id}/", "GET")]
public class GetBlahById : GetBlahRequest, IReturn<BlahResponse>
{
}

[Route("/Model/Blah/BySlug/{Slug}/", "GET")]
public class GetBlahBySlug : GetBlahRequest, IReturn<BlahResponse>
{
}

[Route("/Model/Blah/BySeriesId/{BlahSeriesId}/", "GET")]
public class GetBlahBySeriesId : GetBlahRequest, IReturn<BlahResponse>
{
}

然后在你的行动方法中:

public BlahResponse Get(GetBlahById request)
{
    return GetBlah(request);
}

public BlahResponse Get(GetBlahBySlug request)
{
    return GetBlah(request);
}

public BlahResponse Get(GetBlahBySeriesId request)
{
    return GetBlah(request);
}

BlahResponse GetBlah(GetBlahRequest request)
{
    // Code to return BlahResponse
    return ...
}

然后您的客户需要致电:

var blahResult = _client.Get(new GetBlahById { Id = model.BlahId });
相关问题