2012-04-18 23 views
1

我有一個操作方法,我用來檢索用戶的圖片,但是我的一些用戶可能已經使用Facebook登錄,我不想返回存儲圖片,但是從Facebook的人,所以我想是這樣的:ASP.NET MVC:重定向只爲圖像第一次工作

public ActionResult Picture(long id) 
{ 
    var user = UsersService.GetUser(id); 

    if (user.IsConnectedWithFacebook) 
    { 
    var url = "http://graph.facebook.com/" + user.GetFacebookId() + "/picture?type=square"; 
    return Redirect(url); 
    } 

    return File(user.PictureData, user.PictureContentType); 
} 

,並在網頁上我只是用:

<img src='@Url.Action("Picture", new {User.Id})' /> 

這工作完全在我第一次加載頁面,但是第二次圖像不顯示。我檢查了呼叫只是行動,第二次顯示的頁面與

"Object moved to here." 

這就是爲什麼img標記不加載任何圖像。

有沒有辦法來防止這種情況發生?我在其他一些線程中讀到人們推薦返回301(而不是由Redirect返回的302),但它返回與鏈接相同的頁面(並且實際請求返回200而不是301或302)。

任何想法如何強制它總是返回重定向?

我真的不想添加邏輯來選擇要加載到頁面的圖像,我也不想在服務器上請求數據,然後將其返回到頁面,因爲它可能很慢,成爲帶寬問題。

感謝您的幫助。

+0

關於帶寬和性能,重定向選項需要兩次到服務器的往返服務才能提供圖像。這是一個相關的問題:http://stackoverflow.com/questions/3778347/is-it-ok-to-http-redirect-images – 2012-04-18 03:56:31

+0

我知道這一點,但我很有信心,它會很多更好地向FB服務器提出第二個請求。在另一種情況下,我將不得不在控制器中爲FB服務器創建一個Web請求,獲取數據並將其返回給客戶端。這意味着第二個請求會發生,但在這種情況下,我的服務器將浪費帶寬,而不是客戶端)。 – willvv 2012-04-18 16:39:47

+0

我看不出任何你需要將實際圖像從FB傳輸到Web服務器的原因。我同意,這將是一個非常糟糕的設計。絕對不是我提議的。 – 2012-04-18 17:05:26

回答

0
if (user.IsConnectedWithFacebook) 
{ 
    var url = "http://graph.facebook.com/" + user.GetFacebookId() + "/picture?type=square"; 
    return Redirect(url); 
} 

我認爲這段代碼應該返回新的ContentResult(){Content = url};代替。

另外在UI層上,我會建議您按照操作的參數中指定的方式提供Id。

<img src='@Url.Action("Picture")' /> 
+0

是的,標記是創建問題的錯誤,但在我的代碼中是正確的。你的建議不能解決我的問題,我沒有從操作方法返回url,我返回了實際的圖像。你的建議返回的網址。 – willvv 2012-04-18 00:51:12

0

,而不是你的圖像打印控制器使用重定向,你爲什麼不點在Facebook網址的IMG SRC在你的模板....不知道語法是正確的(事實上,我敢肯定它不是),但這樣的:

@if(user.IsConnectedWithFacebook) 
{ 
    <img src="http://graph.facebook.com/"...... 
} 
else 
{ 
    <img='@Url.Action("Picture")' /> 
} 

或者,更優雅和可重複使用的,將邏輯爲靜態方法控制器上:

<img src="@ProfileController.GetUserImageUrl(id) /> 

其中

public static string GetUserImageUrl(long id) 
{ 
    var user = UsersService.GetUser(id); 

    if (user.IsConnectedWithFacebook) 
    { 
     return "http://graph.facebook.com/" + user.GetFacebookId() + "/picture?type=square"; 
    } 
    return Url.Action("Picture"); 
} 
+0

我只是不想將該邏輯添加到視圖,重定向似乎更簡單和「優雅」,因爲配置文件操作方法實際上會導致所有情況下都返回配置文件圖片。 – willvv 2012-04-18 02:16:52

+0

查看更新的答案。應該涵蓋你的優雅問題,並且比重定向解決方案更具性能(不是一個字,但應該是)。 – 2012-04-18 03:57:56

+0

有趣的是,儘管在控制器中使用靜態方法可能是一個非常糟糕的主意,但除非使用鎖定,否則會產生許多意想不到的結果,這會導致方法出現瓶頸。我仍然想要使用重定向,我只想知道誰負責返回帶有新位置鏈接的頁面(ASP.NET?IIS?瀏覽器?) – willvv 2012-04-18 16:36:41