如何使用ServiceStack将请求中继到另一个ServiceStack服务器

时间:2014-09-07 04:54:25

标签: servicestack

我需要将请求转发到我的ServiceStack服务器(称为服务器1)到另一个ServiceStack服务器(称为服务器2)。我不打算讨论为什么我需要这个,而是如何在技术上解决它 这是我在服务器1和服务器2中的DTO代码:

// Jma data
[Route("/jmalist", "GET")]
[Route("/jmalist/{Instrument}/{Interval}/{Session}/{Smooth}/{Phase}", "GET")]
[Route("/jmalist/{Instrument}/{Interval}/{Session}/{Smooth}/{Phase}/{User}", "GET")]
public class JmaSets : IReturn<List<BarSet>>
{
    public string Instrument { get; set; }
    public int Interval { get; set; }
    public string Session { get; set; }
    public double Smooth { get; set; }
    public double Phase { get; set; }
    public string User { get; set; }
    public DateTime sTime { get; set; }
    public DateTime eTime { get; set; }
}   

这是服务器1中的服务代码:

public class JmaSetsService : Service
{
    public object Get(JmaSets request)
    {
        List<BarSet> jmaSetList = new List<BarSet>();
        string baseUrl = "http://localhost:1311";
        JsonServiceClient srv = new JsonServiceClient(baseUrl);
        jmaSetList = srv.Get<List<BarSet>>(request); 
        return jmaSetList;
    }
}

目的是接收对路由“/ jmalist”的请求,该路由然后在请求中具有完整的DTO信息,并且访问服务器2以获得DTO数据。问题是没有地方放置路线“/ jmalist”并且传递“请求”似乎没有路线随之而来。如何请求与此请求的输入完全相同的DTO,但是请求我的服务器2服务器?

另一种说明这一点的方法是确保从浏览器或REST客户端发生的事情。我可以直接对服务器1或服务器2进行DTO请求。服务器2很简单,因为它只响应请求的数据。服务器1没有数据,但会从服务器2获取数​​据。这是此代码的目标。

(我应该注意,我知道Json如何将字段序列化为一个新的请求URL,但这似乎非常低效且代码密集无用。)

1 个答案:

答案 0 :(得分:0)

ServiceStack C# Service Clients在发出GET请求时根据请求DTO的填充值使用最佳匹配路由,因此路由信息不在请求中DTO实例本身,当发送请求DTO时,服务客户端使用路径定义,其中最接近的拟合用于发出请求。

由于ServiceClients也接受字符串URL,您可以使用base.Request获取有关服务中的请求的HTTP请求信息,另一种方法是传递调用请求的路径信息,例如:< / p>

var srv = new JsonServiceClient("http://localhost:1311");
var jmaSetList = srv.Get<List<BarSet>>(base.Request.PathInfo);