3

セキュリティ上の理由から、私は2つのWebApiサービスを構築しています。最初のWebApiアプリは、画像生成サービスにアクセスでき、セキュリティプロキシとして機能します。2番目のWebApiアプリは、インターネットから最初のアプリを呼び出し、画像を取得します。

しかし、画像の通過を正しくネゴシエートできないようです。私の考えは、セキュリティプロキシ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の配列が返されます。

呼び出し元のWebAPIサービスは次のようになります。

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

SNIP *

誰かが私が間違っていることを知っていますか?

ありがとう!

クリス

解決しました

識別されたソリューションを活用する呼び出しコードに興味がある人は、次のようになります。

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 に答える