2016-05-05 5 views
0

Ich verwende WebAPI 2 und ich finde, dass die meisten meiner API POST-Endpunkte erfordern die gleichen zwei Werte zum Modell hinzugefügt werden: UserId von HttpContext.Current.User.Identity.GetUserId() und SignalR_ConnectionId aus einem benutzerdefinierten Anforderungsheader. Ich möchte diese beiden Werte dem Modell hinzufügen, ohne den gleichen Code in jedem Request-Handler zu wiederholen.Hinzufügen von Werten zum Web-API-Modell mit ActionFilter oder Custom Model Binder?

Ich mag die Idee, einen ActionFilter zu verwenden, denn dann kann ich die Endpunkte, die diese Funktionalität mit der Anmerkung benötigen, problemlos dekorieren. Bisher meine Action sieht wie folgt aus:

public class AddUserIdActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var headerValues = actionContext.Request.Headers.GetValues("SignalRId"); 

     if (HttpContext.Current.User.Identity != null) 
     { 
      Guid userId = Guid.Parse(HttpContext.Current.User.Identity.GetUserId()); 
     } 
     else 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 
     } 

     //Modify the model?? 
    } 
} 

Wie modifiziere ich das Modell innerhalb des Action? (Ich nehme an, dass jedes Modell, das mit dem Attribut versehen ist, von einer Basisklasse mit einer Eigenschaft für userId und SignalRId abstammt).

Wenn ich die Werte nicht zum Modell hinzufügen kann, muss ich eine benutzerdefinierte Modellbinder berücksichtigen. Ich möchte die Standardmodellbindung nicht ändern, sondern einfach meine beiden Eigenschaften zu dem hinzufügen, was bereits passiert. Wie erreiche ich das in Web API 2?

Antwort

0

Folgendes funktionierte gut.

public class AddUserIdActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     IEnumerable<string> headers; 
     string connectionId; 
     Guid userId; 

     if(actionContext.Request.Headers.TryGetValues("SignalR_Id", out headers)) 
     { 
      connectionId = headers.First(); 
     } 
     else 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest)); 
     } 

     if (HttpContext.Current.User.Identity != null) 
     { 
      userId = Guid.Parse(HttpContext.Current.User.Identity.GetUserId()); 
     } 
     else 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized)); 
     } 

     try 
     { 
      var model = (BaseCommand)actionContext.ActionArguments.Values.First(); 
      model.UserId = userId; 
      model.ConnectionId = connectionId; 
     } 
     catch 
     { 
      throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)); 
     } 
    } 

} 
Verwandte Themen