Downloaden Sie und bringen Sie eine Datei aus asp.net webapi

Ich würde gerne laden Sie ein Bild von einer url und servieren Sie es über einen controller. Im Idealfall möchte ich streamen, so viel wie möglich, anstatt zu versuchen, zu erstellen byte-arrays, etc.

Der Grund, warum ich beim herunterladen von Dateien über meinen controller, anstatt nur geben foo.ImageUrl für den Verbraucher ist, weil die urls sind http und ich bin proxying zu vermeiden gemischten Inhalten. Diese Tätigkeit wird aufgerufen, indem Sie die absolute url in html - img tags

Dies ist, was ich habe, so weit:

Das problem ist, dass das Bild nicht scheinen, um beliebige Inhalte haben. Die img tag sieht leer, und wenn ich navigieren, um es in meinem browser, ich sehe nur die überschriften und nichts versucht zu laden?

Wie mache ich den Download von einer url und er es als stream an den Aufrufer arbeiten?

[HttpGet]
[AllowAnonymous]
[Route(template: "Reward/FooLogo/{fooId}/bar/{barId}", Name = "FooLogo")]
public async Task<StreamContent> FooLogo(int fooId, int barId)
{
    var foo = await GetFooAsync(fooId, barId);
    if (string.IsNullOrWhiteSpace(foo?.ImageUrl))
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }

    using (var response = await WebRequest.Create(foo.ImageUrl).GetResponseAsync())
    {
        //todo check content type
        var responseStream = response.GetResponseStream();

        var content = new StreamContent(responseStream);
        content.Headers.ContentType = new MediaTypeHeaderValue(response.ContentType);
        content.Headers.ContentLength = response.ContentLength;

        return content;
    }
}
stackoverflow.com/a/9549889/4149098 funktioniert nicht für Sie?
In Ihrem code, den Sie erstellen Sie eine web-Anfrage streamen und dann den stream über StreamContent und dann entsorgen Sie die zugrunde liegende Verbindung (in der using-block). Natürlich der Anrufer kann niemals etwas machen, was mit es, der zugrunde liegende stream ist entsorgt, wenn das Ergebnis zurückgegeben wird, von der FooLogic nennen.
Wahrscheinlich die Antwort stream entsorgt werden, bevor die Inhalte ausgeliefert werden können. Kopieren Sie den Inhalt in einen neuen stream und zurückgeben stream
Möglich, Duplikat der Rückkehr Binärdatei vom controller in ASP.NET Web-API
Hmm. So StreamContent übernimmt die Verantwortung für die Entsorgung der Anfrage und ich sollte es nicht tun. Ich werde prüfen, ob aus.

InformationsquelleAutor Nathan Cooper | 2017-02-23

Schreibe einen Kommentar