Fügen Sie einen benutzerdefinierten header der Antwort in ApiController
Bis jetzt hatte ich eine GET
Methode, die aussah wie die folgenden:
protected override async Task<IHttpActionResult> GetAll(QueryData query)
{
//... Some operations
//LINQ Expression based on the query parameters
Expression<Func<Entity, bool>> queryExpression = BuildQueryExpression(query);
//Begin to count all the entities in the repository
Task<int> countingEntities = repo.CountAsync(queryExpression);
//Reads an entity that will be the page start
Entity start = await repo.ReadAsync(query.Start);
//Reads all the entities starting from the start entity
IEnumerable<Entity> found = await repo.BrowseAllAsync(start, queryExpression);
//Truncates to page size
found = found.Take(query.Size);
//Number of entities returned in response
int count = found.Count();
//Number of total entities (without pagination)
int total = await countingEntities;
return Ok(new {
Total = total,
Count = count,
Last = count > 0 ? GetEntityKey(found.Last()) : default(Key),
Data = found.Select(e => IsResourceOwner(e) ? MapToOwnerDTO(e) : MapToDTO(e)).ToList()
});
}
Dieser arbeitete wie ein Charme, und es war gut. Allerdings wurde mir gesagt, vor kurzem zum senden der Antwort Metadaten ( Total
, Count
und Last
Eigenschaften) als Antwort benutzerdefinierte Header statt der Antwort Körper.
Kann ich nicht verwalten, um den Zugriff auf die Response
von der ApiController. Ich dachte an einen filter oder ein Attribut, aber wie bekomme ich die Metadaten?
Kann ich halten alle diese Informationen auf die Antwort und dann haben Sie einen filter, deserialisiert die Antwort, bevor Sie an den client gesendet, und eine neue erstellen mit dem Header, aber das scheint lästig und schlecht.
Gibt es eine Möglichkeit zum hinzufügen von benutzerdefinierten Kopfzeilen direkt aus dieser Methode auf ein ApiController
?
Ich habe nicht ein
HttpContext
Eigenschaft, aber ich habe ein ActionContext
. Allerdings Response
Eigenschaft des Objekts null
und ich kann nicht arbeiten mit ihm.Sie benötigen ActionContext.Anfrage.CreateResponse (), um tatsächlich zu erstellen, eine Antwort-und legen Sie dann die Werte in der Antwort als ein stark typisiertes Objekt anstelle von Zeichenfolgen
Ich möchte für das Web-Api zu serialisieren mein anonymes Objekt (d.h. die Web-Api
Ok<T>(T t)
Methode. Dazu gehört auch, dass einige Header für mich). Wenn ich eine Antwort habe ich auf mein Objekt serialisieren und ich habe alle überschriften manuell.verschieben Sie alle header-Einstellung, Teil einer Methode, und verwenden Sie diese Methode an beiden Orten
InformationsquelleAutor Matias Cicero | 2015-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich eingegeben Kommentare, hier ist meine vollständige Antwort.
Benötigen Sie zum erstellen eines benutzerdefinierten filters und anwenden, die zu Ihrer Steuerung .
In Ihrem Controller
Das sieht aus wie doppelte Arbeit für mich. Sie können einen header direkt
aber dann verlieren Sie die stark typisierte Antwort, die die OP noch nicht verwendet, aber ist immer noch eine option mit diesem Ansatz. Ich arbeite an einer web-api-Projekt und nicht mit starken Typen, die wird Probleme verursachen - zum einen können wir nicht einfach generieren korrekte stolzieren. Vermeiden Sie die Rücksendung nicht typisierte Antworten, wenn Sie kann
Ich habe diese Methode zum generieren von swagger mit keine Probleme. Das einzige Problem, das ich gesehen habe, ist, wenn es um unit-Tests der controller-Aktion, aber es ist immer noch möglich, es zu tun.
In meinem Fall habe ich festgestellt, dass dies die beste Lösung für die Rückgabe response-Daten in den Kopf -, aber Sie müssen vorsichtig sein, wo die action-filter erhält die Daten. Ich muss die Daten für die Anforderung der Verarbeitung, ich sah Sie alle über den Ort für die Speicherung von Daten, die einzigartig für die Anfrage und das einzige, was ich finden konnte ist der "Kontext.Anfrage.Eigenschaften" - Tabelle, die ist wahrscheinlich, warum @Yousuf verwendet. Halten in mir, dass der "Kontext.Antwort" Objekt nicht vorhanden ist, die während der Bearbeitung der Aktion, also "Kontext.Antrag" scheint der einzige Ort zu sein, können Sie speichern Daten wie diese.
InformationsquelleAutor Yousuf
Können Sie explizit hinzufügen benutzerdefinierter Header in einer Methode, etwa so:
Für mehr Informationen Lesen Sie diesen Artikel: http://www.jerriepelser.com/blog/paging-in-aspnet-webapi-http-headers/
Hat deine Anfrage gehen über proxies? Wenn ja kann man das Lesen: stackoverflow.com/questions/20820572/...
War für mich aber kein proxy involviert in unsere Verbindung
InformationsquelleAutor Seagull
Was Sie brauchen, ist:
Ich hoffe, das beantwortet Ihre Frage.
InformationsquelleAutor Nikola
Einfache Lösung ist zu tun:
Im API-Controller.
warum ist das downvoted?
InformationsquelleAutor Deepak
Können Sie eine benutzerdefinierte ActionFilter, das Ihnen erlaubt, zu senden, benutzerdefinierte Header und den Zugriff auf den HttpContext:
Interessante Fragen. Es sieht aus wie Sie können, legen Sie die Eigenschaft Request.Properties["Count"] = "123" im controller und im filter.
In den filter können Sie darauf zugreifen, indem actionContext.Anfrage.Properties["Count"]
InformationsquelleAutor Chris Bohatka