2016-05-12 19 views
3

私はMVC5プロジェクトを持っています。コントローラからwebapiメソッドを呼び出す必要があります。 WebAPIはトークンベースの認証で実装されています。つまり、各呼び出しごとにトークンを渡す必要があります。私はhttpheaderでトークンを渡すために以下のコードを使用しています。私は、単一のHTTPClientを使用すると、ヘッダーではなく、それぞれのヘッダとすべてのアクションメソッドを追加して、一つの場所に追加する必要があり、同じようmvcコントローラからwebapiを呼び出し、同じhttpclientを使用します。

HttpClient httpClient = new HttpClient(); 
     string baseUrl = "http://localhost:60477/"; 
dynamic token = Session["token"]; 
      if (token.AccessToken != null) 
      { 
       httpClient.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", token.AccessToken)); 
      } 

私は私のコントローラで複数のアクションメソッドを持っています。どこで私はすべてのコントローラに共通のmvc applictaionにhttpclientヘッダー登録コードを置くことができます。つまり、それぞれのアクションメソッドにトークンを追加するようなコードを繰り返す必要はありません。どのようにすればいいのですか?

Public ActionResult Postuser(UserModel user) 
{ 
//post code 
} 
Public ActionResult getuser(UserModel user) 
{ 
HttpResponseMessage response = httpClient.GetAsync(baseUrl + "api/Admin/GetStates").Result; 
      if (response.IsSuccessStatusCode) 
      { 
       string stateInfo = response.Content.ReadAsStringAsync().Result; 
    } 

} 
Public ActionResult PostRoles(RoleModel role) 
{ 
//post roles code 
} 

答えて

4

は、ここでは一つの良いリンクです。

public class HttpClientHelper 
{ 
    public static HttpClient GetHttpClient() 
    { 
     var MyHttpClient = new HttpClient(); 
     dynamic _token = HttpContext.Current.Session["token"]; 
     if (_token == null) throw new ArgumentNullException(nameof(_token)); 
     MyHttpClient.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", _token.AccessToken)); 
     return MyHttpClient; 
    } 
} 

のようなものと、単一責任の原則に付着し、それ自身のクラス内の他のサービスとの相互作用を抽出することをお勧めし

public ActionResult getuser(UserModel user) 
{ 
    var httpClient = HttpClientHelper.GetHttpClient(); 
    HttpResponseMessage response = httpClient.GetAsync(baseUrl + "api/Admin/GetStates").Result; 
    if (response.IsSuccessStatusCode) 
    { 
     string stateInfo = response.Content.ReadAsStringAsync().Result; 
    } 
} 
1

コントローラでアクションフィルタを使用できます。あなたが異なるコントローラごとに異なるロジックを持つことができますので、OnActionExecutingメソッドは、コントローラスコープであるthis-

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    // some condition code to target a specific method in the controller 
    // Example 
    if (filterContext.ActionDescriptor.ActionName == "getuser") // <-- your method 
    { 
    // put your token based authentication code here 
    } 

    base.OnActionExecuting(filterContext); 
} 

ようになりますオーバーライドを追加してみてください。

アクションメソッドの後にコードを実行する場合は、OnActionExecutedメソッドオーバーライドもあります。

------編集--------------限り、あなたのHttpClientコードスニペットを配置する場所、あなたがthis-

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    HttpClient httpClient = new HttpClient(); 
    string baseUrl = "http://localhost:60477/"; 
    dynamic token = Session["token"]; 

    if (token.AccessToken != null) 
    { 
    httpClient.DefaultRequestHeaders.Add(
     "Authorization", 
     string.Format("Bearer {0}", token.AccessToken) 
    ); 

    httpClient.BaseAddress = new Uri(baseUrl); 
    } 

    if(filterContext.ActionParameters.ContainsKey("httpClient")) 
    { 
    filterContext.ActionParameters["httpClient"] = httpClient; 
    } 
    else 
    { 
    // error 
    } 

    base.OnActionExecuting(filterContext); 
} 
を試みることができるよう

したがって、HttpClientオブジェクトは、OnActionExecutingでbaseUrlの割り当てとともに設定されます。このコードは、リファクタリングするコントローラでActionResultを返すメソッドの前に実行されます。すべてのメソッドではなく、一部を対象にしたい場合は、上記のOnActionExecutingの最初の例を参照してください。

public ActionResult getuser(UserModel user, HttpClient httpClient) 
{ 
    HttpResponseMessage response = httpClient.GetAsync("api/Admin/GetStates").Result; 

    if(response.IsSuccessStatusCode) 
    { 
    string stateInfo = response.Content.ReadAsStringAsync().Result; 
    } 

    // the rest of your code for getuser.. 

    return View(); 
} 

これで、getuserメソッドに追加のパラメータ(HttpClient httpClient)が追加されました。

+0

トークンベースのコードをそこに置くにはどうすればいいですか? – SivaRajini

+0

編集を私の投稿にしてください。また、Ilya Chernomordikが提案したサービスを注入することは理想的であり、Dannyはヘルパーメソッドを使用することを提案しています。私の提案は最高ではないかもしれませんが、アクションフィルタをエクスポージャーにしたい場合は試してみてください。メソッドに追加されたHttpClientパラメータは、OnActionExecutingオーバーライドメソッドのコードをサービスオブジェクトに移動して注入するサービスオブジェクトにリファクタリングできます。希望が助けてくれる!ありがとうございます。 – alphaneer

2

としてあなたのコントローラでそれを呼び出す、例えば

public class ServiceClient : IServiceClient 
{ 
    private HttpClient m_Client;   

    public ServiceClient 
    { 
     m_Client = new HttpClient(); 
     // Initialize the client as you need here 
    } 

    public void CallSomeMethod() 
    { 
     // Call method on the client 
    } 
} 

次に、コントローラにIServiceClientを挿入し、そのメソッドを呼び出します。あなたが注入を使用しない場合(私はあなたが行うことをお勧めします)、コントローラのコンストラクタで新しいインスタンスを作成することができます。

関連する問題