从mvc控制器调用webapi并使用相同的httpclient

Siv*_*ini 4 c# asp.net-mvc asp.net-web-api asp.net-mvc-5

我有MVC5项目,从控制器需要调用webapi方法.Webapi由基于令牌的身份验证实现.因此我必须为每个调用传递令牌.我使用下面的代码在httpheader中传递令牌.

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));
            }
Run Code Online (Sandbox Code Playgroud)

我在我的控制器中有多个动作方法,比如,我想使用单个httpclient,并且需要在一个地方添加标题,而是在每个动作方法中添加标题.我可以将httpclient标题注册码放在mvc应用程序中,以便所有控制器都可以使用.这意味着我不想重复代码,比如在每个动作方法中添加令牌.我怎样才能做到这一点

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
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ndy 6

您可以尝试创建一个小助手类来创建httpclient对象.就像是

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中将其称为

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;
    }
}
Run Code Online (Sandbox Code Playgroud)