2014-02-05 44 views
0
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調用的一個返回圖像的鏈接,我是怎麼實現這個目的是重定向到具有圖像的另一個鏈接,例如:C#的WebAPI重定向到顯示圖像

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並且未通過身份驗證。我不知道第二個事件觸發的位置,因此我不知道如何手動設置該標題。

+0

重定向可能不會發送auth頭。您是否嘗試過使用憑證緩存設置的常規客戶端進行重定向? –

+0

我不認爲這是問題所在,因爲即使我嘗試從目錄加載圖像並將其以字節返回,它仍然不會顯示 – noobiehacker

+0

但是,當您直接訪問URL時它確實有效,對嗎?只有當你重定向URI被破壞了? –

回答

0

可以使用FileResult例如

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

在這種情況下,文件功能需要的文件路徑和內容類型,並返回一個文件的響應。

+0

這不完全是我想要完成的,我想重定向到另一個具有圖像的Http URL – noobiehacker

2

您無法重定向到響應此URL中的圖像,您的調用者將能夠更改位置。

首先解決方案,請嘗試使用直接在圖片搜索結果的網頁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; 
} 
+0

有沒有辦法將文件返回到「http://steve.files.wordpress.com/2006/03/矩陣%20tut%202.jpg「」而不是實際上將該文件保存在我的記憶中,而不是返回它? – noobiehacker

+0

「移動狀態代碼,爲smaple」是我正在尋找。謝謝。 –

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; 
}