Ho implementato correttamente un formattatore di tipi di supporti Csv nel mio progetto API Web ASP.Net. Sono in grado di ottenere risultati in formato CSV. Tuttavia il nome file risultante è "parti" senza un'estensione.Asp.net Web API - Come impostare il nome file per un formattatore di tipi di supporti CSV personalizzato
Idealmente, voglio essere in grado di impostare questo nome di file nel controller, ma essere in grado di aggiungere l'estensione globalmente sarebbe un minimo.
Qui di seguito sono gli esempi che ho trovato
OnGetResponseHeaders Override - non vedo che come opzione nella versione attuale. http://forums.asp.net/t/1782973.aspx/1?Setting+response+and+content+headers+esp+ContentDisposition+inside+a+MediaTypeFormatter
Secondo tale articolo questo dovrebbe funzionare
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") };
}
Tuttavia Visual Studio dice: "Non esiste un metodo adatto per override" e non verrà compilato quando aggiungo che, per mia abitudine Csv Formatter.
Restituisci HttpMessageResponse dal controller - How to set downloading file name in ASP.NET Web API Tuttavia sembra che stia semplicemente spingendo i file del server esistenti, il che toglierebbe la serializzazione Csv dal mix. Di seguito è un tentativo di fare questo lavoro approccio:
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;
}
Il problema qui è che il nuovo StreamContent() si aspetta un flusso - c'è un modo per ottenere il flusso di corrente che su misura Csv Formatter creato?
In conclusione, come posso impostare il nome file per un set di risultati che viene prima serializzato in formato Csv?
Soluzione
Grazie Claudio - che mi ha fatto andare nella giusta direzione. Un paio di modifiche da quello che hai postato:
ero derivanti da BufferedMediaTypeFormatter per mia abitudine Csv Formatter e di utilizzare SetDefaultContentHeaders ho dovuto invece derivano dalla MediaTypeFormatter.
SetDefaultContentHeaders accetta il parametro mediaType con un tipo di MediaTypeHeaderValue e non una stringa.
Ecco il codice finale:
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.Add("Content-Disposition", "attachment; filename=testorama.csv");
}
Perché è necessario ereditare 'MediaTypeFormatter' anziché il' BufferedMediaTypeFormatter', penso che entrambi dovrebbero funzionare. –
@Tomas, Sembra che tu abbia ragione - SetDefaultContentHeaders è disponibile anche con BufferedMediaTypeFormatter. –