1

我有一个用于检索用户图片的操作方法,但是我的一些用户可能已经使用 Facebook 登录,我不想返回存储的图片而是来自 Facebook 的图片,所以我正在尝试这样的事情:

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)。

关于如何强制它始终返回重定向的任何想法?

我真的不想添加逻辑来选择要加载到页面的图像,我也不想请求服务器上的数据然后将其返回到页面,因为它可能会很慢并成为带宽问题.

谢谢你的帮助。

4

2 回答 2

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

我认为这段代码应该返回 new ContentResult() { Content = url }; 反而。

同样在 UI 层,我建议您提供操作参数中指定的 ID。

<img src='@Url.Action("Picture")' />
于 2012-04-18T00:43:34.613 回答
0

与其在图像控制器中使用重定向,不如将 img src 指向模板中的 facebook url ......不确定语法是否正确(事实上,我确定它不是),但类似:

@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");
}
于 2012-04-18T01:53:45.000 回答