Ich habe erfolgreich einen Csv Media Type Formatter in meinem ASP.Net Web API Projekt implementiert. Ich bin in der Lage, Ergebnisse im Csv-Format zurück zu bekommen. Der resultierende Dateiname ist jedoch "Teile" ohne eine Erweiterung.Asp.net Web API - Wie man den Dateinamen für einen benutzerdefinierten CSV Media Type Formatter einstellt
Im Idealfall möchte ich in der Lage sein, diesen Dateinamen im Controller zu setzen, aber die Erweiterung global hinzufügen zu können, wäre ein Minimum.
Im Folgenden sind die Beispiele, die ich
Aufschalten OnGetResponseHeaders gefunden haben - ich sehe das nicht als Option in der aktuellen Version. http://forums.asp.net/t/1782973.aspx/1?Setting+response+and+content+headers+esp+ContentDisposition+inside+a+MediaTypeFormatter
Nach diesem Artikel sollte diese Arbeit
public override IEnumerable<KeyValuePair<string, string>> OnGetResponseHeaders(Type objectType, string mediaType, HttpResponseMessage responseMessage)
{
return new[] { new KeyValuePair<string, string>("Content-Disposition", "attachment; filename=testing.csv") };
}
jedoch Visual Studio sagt: „Es gibt keine geeignete Methode zur Überschreibung ist“ und wird nicht kompiliert, wenn ich das auf meinen eigenen CSV-Formatter hinzufügen.
Rückgabe HttpMessageResponse von Controller - How to set downloading file name in ASP.NET Web API Allerdings scheint dies nur bestehende Server-Dateien schieben, die die Csv-Serialisierung aus dem Mix nehmen würde. Im Folgenden ist ein Versuch, diesen Ansatz funktioniert:
public HttpResponseMessage Get(string id)
{
var response = new HttpResponseMessage();
if (id == "test")
{
var data = GetTestData();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(data);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "testorama.csv";
return response;
}
return null;
}
Das hier Problem ist, dass neuer StreamContent() einen Strom erwartet - ist es eine Möglichkeit, den aktuellen Stream zu erhalten, die eigene CSV-Formatter erstellt?
Bottom line, wie kann ich den Dateinamen für ein Resultset, das zuerst in Csv-Format serialisiert ist, festlegen?
Lösung
Dank Claudio -, die ich in der richtigen Richtung bekamen. Ein paar Änderungen von dem, was Sie auf dem Laufenden:
Ich war von BufferedMediaTypeFormatter für meine Gewohnheit Csv Formatter Ableiten und SetDefaultContentHeaders verwenden musste ich stattdessen von MediaTypeFormatter abzuleiten.
SetDefaultContentHeaders akzeptiert den Parameter mediaType mit dem Typ MediaTypeHeaderValue und nicht string.
Hier ist der endgültige Code:
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.Add("Content-Disposition", "attachment; filename=testorama.csv");
}
Warum mussten Sie "MediaTypeFormatter" anstelle von "BufferedMediaTypeFormatter" erben, ich denke beide sollten funktionieren. –
@Tomas, Sieht aus, als ob Sie Recht haben - SetDefaultContentHeaders ist auch mit BufferedMediaTypeFormatter verfügbar. –