【问题标题】:ASP.NET MVC: Redirect works only first time for imageASP.NET MVC:重定向仅对图像第一次起作用
【发布时间】:2012-04-29 09:03:37
【问题描述】:

我有一个用于检索用户图片的操作方法,但是我的一些用户可能使用 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)。

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

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

感谢您的帮助。

【问题讨论】:

  • 就带宽和性能而言,重定向选项需要两次往返服务器才能提供图像。这是一个相关的问题:stackoverflow.com/questions/3778347/…
  • 我知道这一点,但我非常有信心向 FB 服务器发出第二个请求会好得多。在另一种情况下,我必须在控制器中向 FB 服务器创建一个 Web 请求,获取数据,然后将其返回给客户端。这意味着无论如何都会发生第二个请求,但在这种情况下,我的服务器将浪费带宽,而不是客户端)。
  • 我看不出您需要将实际图像从 FB 传输到 Web 服务器的任何原因。我同意,那将是一个非常糟糕的设计。绝对不是我提议的。
  • 你有没有找到解决这个问题的方法。我自己也碰到了。我也不想使用视图逻辑,因为我将处理多个客户端。

标签: asp.net-mvc redirect


【解决方案1】:
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")' />

【讨论】:

  • 是的,标记是创建问题的错误,但在我的代码中是正确的。您的建议并不能解决我的问题,我没有从操作方法返回 url,而是返回实际图像。你的建议返回网址。
【解决方案2】:

与其在图像控制器中使用重定向,不如将 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");
}

【讨论】:

  • 我只是不想将这种逻辑添加到视图中,并且重定向看起来更简单和“优雅”,因为 Profile 操作方法实际上会导致在所有情况下都返回 Profile 图片。跨度>
  • 查看更新的答案。应该涵盖您的优雅问题并且比重定向解决方案更高效(不是一个词,但应该是)。
  • 有趣,虽然在控制器中使用静态方法可能是一个非常糟糕的主意,但除非使用锁定,否则可能会出现很多意想不到的结果,这会导致方法出现瓶颈。我仍然想使用重定向,我只想知道谁负责将带有链接的页面返回到新位置(ASP.NET?IIS?浏览器?)
  • 您对静态方法的担心是没有根据的。您不必将 GetUserImageUrl 方法放在控制器中。如果您不希望它在控制器中,它可以位于应用程序中的任何位置。至于瓶颈,除了可能是您的 UsersService(如果您在 Web 应用程序中使用它,无论如何都需要是线程安全的),这种方法没有任何需要锁定的地方。如果您对使用重定向一无所知,我认为您会发现该解决方案比我在这里提出的更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多