2016-05-19 5 views
1

現在、ServiceStackサービスは、内部のServiceStackサービスへの要求を中継する以外は何もしません。ServiceStack - 別のServiceStackサービスへのパススルー

リレーサービスは、このようなセットアップ何か(コードでは、例として簡単製)である。

public class RelayService : Service 
{ 
    public SomeDTO Get(FetchSomething request) 
    { 
     try 
     { 
      return new JsonServiceClient(settings.OtherServiceURL).Get(request); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

    public void Put(PersistSomething request) 
    { 
     try 
     { 
      new JsonServiceClient(settings.OtherServiceURL).Put(request); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 
} 

私の質問は以下のとおりです。

  1. それはそれぞれの最大の新しいJsonServiceClientすることをお勧めします要求?またはインスタンスを挿入する必要がありますか?

  2. 中継サービスには、DTOまたはvoidを返すPut/Getのバリエーションが含まれている可能性があります。中継サービスの各メソッドを複製する代わりに、すべての呼び出しをServiceStackサービスに中継するクリーンな方法がありますか? Any()を使用して、1つまたはいくつかのメソッドですべてを行うことは可能ですか?

ありがとうございます。

答えて

1

これはServiceStackのgeneric reverse proxyの例です。

単純でServiceStackの中で最も一般的なアプローチは、例えば、すぐ下流のサーバに要求を転送し、出力ストリームに応答を書き込みRawHttpHandlerを登録するには、次のようになります。

RawHttpHandlers.Add(_ => new CustomActionHandler((req, res) => 
{ 
    var bytes = req.InputStream.ReadFully(); 
    var proxyUrl = settings.OtherServiceURL.CombineWith(req.RawUrl); 
    var responseBytes = proxyUrl.SendBytesToUrl(method: req.Verb, 
     requestBody: bytes, 
     accept:MimeTypes.Json, 
     contentType: req.ContentType, 
     responseFilter: webRes => 
     { 
      res.StatusCode = (int)webRes.StatusCode; 
      res.StatusDescription = webRes.StatusDescription; 
      res.ContentType = webRes.ContentType; 
     }); 

    res.OutputStream.Write(responseBytes, 0, responseBytes.Length); 
})); 

アクセスするためには別のアプローチは、いくつかを設定することです

SetConfig(new HostConfig { 
    SkipFormDataInCreatingRequest = true 
}); 

:あなたはまた、あなたがしてスキップすることができ、(リクエストボディを読んで、この力として)要求を作成するときにいるFormDataを検査しないようにServiceStackをお伝えしたいと思いますRequestStreamリバースプロキシとして使用するようなものIIS Application Request Routing and URL Rewriting