2013-03-12 76 views
2

出於安全原因,我構建了兩個Web Api服務。第一個Web Api應用程序將有權訪問圖像生成服務,並將充當安全代理。第二個Web Api應用程序將調用來自互聯網的第一個應用程序並檢索圖像。將Wep Api服務中的圖像傳遞給另一個Web Api服務

但是,我似乎無法正確地談判圖像的通過。我的想法是有安全代理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 

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; 


    } 
+0

爲什麼不只是通過圖片的URL,而不是字節? – 2013-03-12 14:46:24

+0

圖像即時生成,調用Web Api服務沒有權限訪問生成函數本身,因此需要安全代理Web API。 – 2013-03-12 15:27:29

回答

3

與您高於目前的返回類型(字節[ ]),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; 
+0

我如何使用調用Web API的響應? – 2013-03-12 16:37:25

+0

你上面的閱讀迴應的代碼在這種情況下也應該沒問題。 – 2013-03-12 16:56:18