2016-05-12 13 views
3

Ich habe MVC5 Projekt, vom Controller müssen die Webapi-Methode aufrufen. Webapi implementiert durch Token-basierte Authentifizierung. Also muss ich das Token für jeden Anruf übergeben. Ich verwende den folgenden Code, um das Token in httpheader zu übergeben.WebAPI von MVC-Controller aufrufen und dasselbe httpclient verwenden

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)); 
      } 

Ich habe mehrere Aktionsmethoden in meinem Controller wie ich will, muss einzelnen Httpclient verwenden und Header an einem Ort hinzugefügt werden, sondern in jedem einzelnen Aktionsmethode Hinzufügen Header. Wo kann ich httpclient Header-Registrierungs-Code in Mvc-Anwendung für alle Controller üblich. Das bedeutet, ich möchte den Code nicht wie das Hinzufügen eines Tokens in jeder Aktionsmethode wiederholen. Wie kann ich das tun?

Antwort

4

Sie können versuchen, Ihre httpclient Objekt eine kleine Hilfsklasse zu schaffen für die Erstellung. So etwas wie

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; 
    } 
} 

und nennt es dann in Ihren Controller als

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

Sie können versuchen, einen Aktionsfilter in Ihrem Controller zu verwenden. Versuchen Sie eine Überschreibung hinzufügen, die so etwas wie 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); 
} 

Die OnActionExecuting Methode ist im Steuerungsbereich sieht, so dass Sie unterschiedliche Logik für unterschiedliche Steuerungen haben.

Es gibt auch eine OnActionExecuted-Methodenüberschreibung, wenn Sie Code nach Ihrer Aktionsmethode ausführen möchten.

------ bearbeiten --------------

Soweit wo Ihr Httpclient-Code-Schnipsel zu platzieren, können Sie 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); 
} 
versuchen

So wird das HttpClient-Objekt zusammen mit der Zuweisung Ihrer baseUrl in OnActionExecuting eingerichtet. Dieser Code wird vor jeder Methode ausgeführt, die ein ActionResult in dem von Ihnen refactorisierten Controller zurückgibt. Wenn Sie auf einige und nicht auf alle Methoden abzielen möchten, lesen Sie das erste Beispiel von OnActionExecuting oben.

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(); 
} 

Jetzt ist Ihre getUser Methode hat einen zusätzlichen Parameter (Httpclient Httpclient).

+0

Wie kann ich den Token-basierten Code dort platzieren – SivaRajini

+0

Siehe die Änderungen zu meinem Beitrag. Auch das Einbringen eines Dienstes, wie Ilya Chernomordik vorgeschlagen hat, ist ebenso ideal wie Dannys Vorschlag, Hilfsmethoden zu verwenden.Mein Vorschlag ist vielleicht nicht der beste, aber wenn Sie Action Filter exporieren wollen, dann versuchen Sie es. Der zu Ihren Methoden hinzugefügte HttpClient-Parameter könnte in ein Serviceobjekt zur Injektion mit dem Code in der OnActionExecuting-Override-Methode, die in das Serviceobjekt verschoben wurde, neu strukturiert werden. Ich hoffe, das hilft! – alphaneer

2

Es ist besser, mit der einheitlichen Prinzip Verantwortung und extrahieren Sie die Interaktion mit einem anderen Dienst in seiner eigenen Klasse zu halten, z.B.

Dann injizieren Sie den IServiceClient in Ihren Controller und rufen Sie einfach seine Methoden. Wenn Sie keine Injektion verwenden (was ich Ihnen rate), können Sie einfach eine neue Instanz im Konstruktor des Controllers erstellen.

Verwandte Themen