(可选)重定向ServiceStack中的所有请求

时间:2017-05-25 12:34:45

标签: c# servicestack

我有一个要求,即一个自托管实例X可选择通过将其重定向到另一台机器上的另一个自托管实例Y来处理请求。实例X根据实例Y进行身份验证。如果有标题" do_redirect"它将执行重定向。是否有一种机制可以为所有自动连接的服务执行此操作?

我考虑过使用接口扩展所有端点并处理每个案例的重定向而不是请求头。

public interface IRedirectRequest {
    string ServerUrl {get; set;}
}

[Route("/api/example", "GET")]
public class ExampleRoute : IRedirectRequest, IReturn<string>
{
   //......
}

但我有超过一百个恩分,这是不可行的。 我也尝试了一个全局请求过滤器,但我学到了,因为我无法直接写入响应dto。

GlobalRequestFilters.Add((request, response, dto) =>
{
    if (!string.IsNullOrEmpty(request.Headers["do_redirect"]))
    {
        var client = new JsonServiceClient(serverYUrl)
        {
            Credentials = new NetworkCredential(apiKey, "")

        };
        // redirect here
        var redirectResponse = client.Send(dto.GetType(), dto);
        // terminate request with data from the other server
        response.Dto = redirectResponse;
        response.EndRequest();
    }
});

1 个答案:

答案 0 :(得分:1)

看起来您希望Generic Proxy不是重定向,您可以使用以下内容实现:

[Route("/proxy")]
public class Proxy : IRequiresRequestStream, IReturn<string>
{
    public string Url { get; set; }
    public Stream RequestStream { get; set; }
}

public object Any(Proxy request)
{
    if (string.IsNullOrEmpty(request.Url))
        throw new ArgumentNullException("Url");

    var hasRequestBody = base.Request.Verb.HasRequestBody();
    try
    {
        var bytes = request.Url.SendBytesToUrl(
          method: base.Request.Verb,
          requestBody: hasRequestBody ? request.RequestStream.ReadFully() : null,
          contentType: hasRequestBody ? base.Request.ContentType : null,
          accept: ((IHttpRequest)base.Request).Accept,
          requestFilter: req => req.UserAgent = "Gistlyn",
          responseFilter: res => base.Request.ResponseContentType = res.ContentType);

        return bytes;
    }
    catch (WebException webEx)
    {
        var errorResponse = (HttpWebResponse)webEx.Response;
        base.Response.StatusCode = (int)errorResponse.StatusCode;
        base.Response.StatusDescription = errorResponse.StatusDescription;
        var bytes = errorResponse.GetResponseStream().ReadFully();
        return bytes;
    }
}

发送到/proxy?url={URL}的每个请求都将代理到该URL。您还需要禁用:

SetConfig(new HostConfig {
    SkipFormDataInCreatingRequest = true
});

这可能会干扰您在上面的代理实现中访问请求正文。