C#Web API重定向到显示图像的链接

时间:2014-02-05 19:25:59

标签: c# image asp.net-web-api http-headers http-redirect

    public HttpResponseMessage getLogoPath(int ID)
    {
        String urlsubfix = dataManager.getMobileLogoPath(ID);
        String urlToReturn =  PictureController.urlprefix  +urlsubfix;
        var response = Request.CreateResponse(HttpStatusCode.Redirect);
        response.Headers.Location = new Uri(urlToReturn);
        return response;
    }

我希望有一个API调用来返回一个图像,我如何实现这个目的是重定向到另一个包含图像的链接,例如:

http://steve.files.wordpress.com/2006/03/Matrix%20tut%202.jpg

我正在尝试使用PostMan来测试它,它让我恢复了破碎的图像。我试着四处寻找,但仍无法找到解决方案。

-----编辑需要此代码的部分代码

    public HttpResponseMessage GetCustomerBarCodeLogo(String ID)
    {
        Barcode BC = new Barcode();
        Image img =BC.Encode(TYPE.CODE128, "123456789");
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        ImageConverter imageConverter = new ImageConverter();
        byte[] resourceByteArray = (byte[])imageConverter.ConvertTo(img, typeof(byte[]));
        MemoryStream dataStream = new MemoryStream(resourceByteArray);
        result.Content = new StreamContent(dataStream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
        return result; 
    }

Result from postman

这会返回一张损坏的图片。

------最新更新

我发现了问题。会发生什么是SSL基本身份验证存在问题。发生的情况是当客户端第一次想要传递请求时,验证设置正确。但是,当它尝试获取由内部代码触发的另一个请求之后的图像时,该请求没有autherizationHeader并且未经过身份验证。我不知道第二个事件在哪里被触发,所以我不知道如何手动设置该标题。

3 个答案:

答案 0 :(得分:2)

您无法重定向回复此网址中的图片,您的来电者可以更改位置。

首先解决方案,尝试直接使用web api的图像结果,样本:

public HttpResponseMessage getLogoPath(int id)
{
    string pathImage = // a way to get the imagem path..

    // create response
    HttpResponseMessage response = new HttpResponseMessage(); 

    // set the content (image)
    response.Content = new StreamContent(new FileStream(pathImage));

    // set the content type for the respective image
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); // or jpg, gif..

    return response;
}

或使用移动状态代码,为smaple:

public HttpResponseMessage getLogoPath(int ID)
{
    String urlsubfix = dataManager.getMobileLogoPath(ID);
    String urlToReturn =  PictureController.urlprefix + urlsubfix;

    var response = Request.CreateResponse(HttpStatusCode.Moved);
    response.Headers.Location = new Uri(urlToReturn);
    return response;
}

答案 1 :(得分:2)

这是一种可能适合您的替代方式。这就是我使用的技术。

public HttpResponseMessage GetCustomerBarCodeLogo(String ID)
{
    Barcode BC = new Barcode();
    Image img =BC.Encode(TYPE.CODE128, "123456789");

    var dataStream = new MemoryStream();
    img.Save(dataStream, ImageFormat.Png);
    dataStream.Position = 0;

    var result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StreamContent(dataStream);
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png");
    return result; 
}

答案 2 :(得分:0)

您可以使用FileResult例如

public FileResult GetLogo(string imageName)
{
    return File(Server.MapPath("~/App_Data/Images/") + imageName, "image");
}

在这种情况下,File函数获取文件路径和内容类型并返回文件响应。