2017-05-25 3 views
1

Ich habe eine Anforderung, bei der eine selbst gehostete Instanz X optional eine Anforderung verarbeitet, indem sie sie an eine andere selbst gehostete Instanz Y auf einer anderen Maschine umleitet. Instanz X wird für Instanz Y authentifiziert. Sie führt die Umleitung durch, wenn eine Kopfzeile "do_redirect" vorhanden ist. Gibt es einen Mechanismus, der dies für alle autodrivierten Dienste tun kann?Optionale Umleitung aller Anforderungen in ServiceStack

Ich überlegte, alle Endpunkte mit einer Schnittstelle zu erweitern und die Umleitung pro Fallbasis anstelle eines Anforderungsheaders zu behandeln.

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

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

aber ich habe über hundert enpoints, dass ist nicht durchführbar. Ich habe auch einen globalen Anfrage-Filter versucht, aber ich habe gelernt, da ich nicht direkt auf die Antwort dto schreiben kann.

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(); 
    } 
}); 

Antwort

1

Es sieht aus wie wollen Sie eine Generic Proxy nicht eine Umleitung, die Sie mit so etwas wie umsetzen können:

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

Wo jeder Anfrage gesendet /proxy?url={URL} zu dieser URL proxied wird. Sie möchten auch deaktivieren:

SetConfig(new HostConfig { 
    SkipFormDataInCreatingRequest = true 
}); 

Das kann den Zugriff auf den Anfragetext in Ihrer Proxy-Implementierung oben beeinträchtigen.