2017-05-25 4 views
1

1つの自己ホスト型インスタンスXが別のマシン上の別の自己ホスト型インスタンスYにリダイレクトすることによって、オプションで要求を処理する必要があります。インスタンスXはインスタンスYに対して認証されます。ヘッダ "do_redirect"がある場合、リダイレクトを行います。すべてのautowiredサービスでこれを行うことができるメカニズムはありますか?オプションでServiceStack内のすべてのリクエストをリダイレクト

私はすべてのエンドポイントをインターフェイスで拡張し、リクエストヘッダーの代わりにリダイレクトをケースごとに処理することを検討しました。

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

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

しかし、私には100ポイント以上が妥当ではありません。 グローバルリクエストフィルタも試しましたが、私はレスポンス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

は、それはあなたのようなものを実装することができますGeneric Proxyないリダイレクトを、したいようになります:/proxy?url={URL}に送信されたすべての要求がそのURLにプロキシされます

[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; 
    } 
} 

SetConfig(new HostConfig { 
    SkipFormDataInCreatingRequest = true 
}); 

これは、上記のProxy実装のリクエスト本体へのアクセスを妨げる可能性があります。

関連する問題