2016-10-19 5 views
1

コントローラーProxyと操作がGetInformationであるとします。コントローラーUsersのメソッドGetInformationを呼び出したいと思っています。どちらのWebAPIコントローラも同じプロジェクトにありますが、別のWeb APIコントローラーを別のWeb APIコントローラーの内部から直接呼び出す

var controller = new UsersController(); 
return controller.GetInformation(request); 

のようなダイレクトコールは機能しません。

シグネチャは次のとおりです。

public HttpResponseMessage GetInformation(InformationRequest request) 

私が外部に露出UserControllerでルートを望んでいないとして、完全なリダイレクト応答を行うにはしたくありません。これは内部のみの呼び出しである必要があります。

+3

なぜ直接呼び出しが機能しないのですか?エラーが発生していますか?他のコントローラを呼び出す代わりに呼び出すことができる内側のレイヤーがある方がいいと感じますが、 – juunas

+0

コントローラを呼び出す代わりに、RedirectToRoute(または)を使ってGetInformationの機能をサービスに移動し、そのサービスを呼び出すことができます。 – sam

+0

@sam - RedirectToRouteはActionResponseを返し、リダイレクトをクライアントに公開します。これはOKではありません(また質問文でも)。 – VulgarBinary

答えて

1

さまざまなコントローラでこのAPIをAPIメソッドに解決したい場合は、動作する解決策が見つかりました。最初の試行は終わり、ちょうどいくつか欠けていました。

var controller = new UserAccountController 
{ 
    Request = new HttpRequestMessage(HttpMethod.Post, Request.RequestUri.AbsoluteUri.Replace("/current/route", "/route/to_call")) 
}; 
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = new HttpConfiguration(); 
return controller.GetInformation(request); 

このようにすることで、ターゲットコントローラを構築し、必要なメソッドを直接呼び出すことができます。ここで最も大きな複雑さは、ウリの調整です。

+1

このlogicaの共通部分でヘルパークラス/メソッドを作成し、uri置換を設定ファイルに移動してその値をヘルパーで使用できるかどうかを確認することができます –

0

はあなたがUserController

public HttpResponseMessage GetInformation(InformationRequest request) 
{ 
    HttpResponseMessage resp ; 

    resp = UserBusinessLogic.GetInformation(request) ; 

    return resp ; 
} 

にこのような何かを行う必要がありますし、あなたのProxyControllerからあなたは同じコードスニペットを使用して、同じ情報を得るために、その「UserBusinessLogic」方法は再使用することができます。

+2

はい、これはこれを解決するための「理想的な」方法です。しかし、すべてのコントローラのロジックを変更してこのアプローチを処理することは現実的ではありません。あなたはアーキテクチャの移行を提供しました。もし私がそれを土台から構築する方法を探していたら、完璧です(またスタックに載せていないだろう)。残念ながら、これは実行可能な選択肢ではありません。 – VulgarBinary

関連する問題