3

出于安全原因,我正在构建两个 Web Api 服务。第一个 Web Api 应用程序将有权访问图像生成服务,并将充当安全代理。第二个 Web Api 应用程序将从 Internet 调用第一个应用程序并检索图像。

但是,我似乎无法正确协商图像的通过。我的想法是让安全代理 Web API 获取图像,然后将其作为字节数组传递给我的其他服务,这将允许用户下载图像。但是,当我的浏览器尝试打开图像时,它总是损坏。

这是获取图像的安全代理,我知道这是成功的:

public byte[] Get(string invoice, string Customer)
    {
        object image;
        try
        {
            image = _repo.GetImage(invoice, Customer);
        }
        catch (ApplicationException exc)
        {
            var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
            {
                Content = new StringContent(string.Format("No Image with Invoice Number = {0}", invoice.ToString())),
                ReasonPhrase = "Image Not Found"
            };
            throw new HttpResponseException(resp);
        }
        catch (Exception exc)
        {
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));

        }
        return (byte[])image;
    }

这将返回一个长度为 40133 的数组。

调用 Web API 服务如下所示:

public HttpResponseMessage Get(string invoice, string Customer)
    {           

        HttpClient client = new HttpClient();

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/octet-stream"));

        byte[] img = client.GetByteArrayAsync("http://localhost:1363/api/Image/" + invoice + "/" + Customer).Result;

        HttpResponseMessage response = new HttpResponseMessage();
        response.Content = new ByteArrayContent(img);
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/tiff");
        var disposition = new ContentDispositionHeaderValue("attachment");
        disposition.FileName = "ImageDocument.tif";
        response.Content.Headers.ContentDisposition = disposition;

        return response;

    }

但是,img 字节数组的长度是 53514。

当浏览器尝试打开图像时,它告诉我它已损坏。如果我在记事本中打开 TIFF,我会得到:

"SUkqAAgAAAASAP4ABAABAAAAAAAAAAABBAABAAAAsAYAAAEBBAABAAAAvgQAAAIBAwABAAAAAQAAAAMBAwABAAAABAAAAAYBAwABAAAAAAAAAAcBAwABAAAAAQAAABEBBAABAAAAAAMAABIBAwABAAAAAQAAABUBAwABAAAAAQAAABYBBAABAAAAvgQAABcBBAABAAAAxZkAABoBBQABAAAA+AIAABsBBQABAAAA8AIAACgBAwABAAAAAgAAADEBAgA4AAAAuAIAADIBAgAUAAAApAIAAOiAAwABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIwMTI6MTA6MDMgMDc6Mjc6MTkAS29mYXggc3RhbmRhcmQgTXVsdGktUGFnZSBUSUZGIFN0b3JhZ2UgRmlsdGVyIHYzLjAzLjAwMADIAAAAAQAAAMgAAAABAAAALcMjAGC+cBQRwhOKcIuzqZDzrHoxF8k+VAOR2cAgjhC5lQEI+VYoiIiIiIiIiJXLAazgaZvMBqEcNI0BoJwaTMGsjgqGA1yOGaUA0Hg0igC5qZ6I1GSsNMuGqeBrI+bBoNYQrfNIiMREWdl4zVWRERkQzVECBpNcRyMCz6PhQgZwQGQLjpCIWwgxERGLLYAx//zLWLx4IeDnBnxSGFMRgIeZ4zcaR+KuPM4KeZ6MBTqKcj8YjAQ4IejDoQ4eE07WGnra3p9w07Xhw1s7NHu+0/v+/SQf6/9+cjwp0Z0Z8KeCm4p4IGQwhoz4cwCFBZN8u8s5duXeXTLva7pN6J56l45sf8u8u

剪辑*

有人知道我在做什么错吗?

谢谢!

克里斯

解决了

如果有人对利用已识别解决方案的调用代码感兴趣,这里是:

public HttpResponseMessage Get(string invoice, string Customer)
    {

        HttpClient client = new HttpClient();

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/tiff"));

        byte[] img = client.GetByteArrayAsync("http://localhost:1363/api/Image/" + invoice + "/" + Customer).Result;

        HttpResponseMessage response = new HttpResponseMessage();
        response.Content = new ByteArrayContent(img);
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/tiff");
        var disposition = new ContentDispositionHeaderValue("attachment");
        disposition.FileName = "ImageDocument.tif";
        response.Content.Headers.ContentDisposition = disposition;

        return response;


    }
4

1 回答 1

3

使用上述当前返回类型 (byte[]) 的操作,Web api 的格式化程序可能正在处理它们,因此您会看到意外的响应。

您可以尝试将图像作为 ByteArrayContent 发送吗?(您需要在此处将 HttpResponseMessage 作为返回类型)

例子:

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new ByteArrayContent(..your byte array here...);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");

return response;
于 2013-03-12T15:52:30.567 回答