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)
您可以尝试创建一个小助手类来创建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)