从MVC Controller Action

时间:2015-12-09 08:56:04

标签: c# html asp.net-mvc-4 email outlook

我有一个邮寄广告系列,可以生成定期发送给客户的HTML电子邮件。

最近,我更改了系统,以允许最终用户配置邮件中的某些图像元素,而不是静态配置。这些图像使用GUID Id存储在数据库中,并通过Controller Action加载,如下所示:

[HttpGet]
[OutputCache(Duration = 3600, Location = OutputCacheLocation.Client, VaryByParam = "id")]
public virtual ActionResult Image(Guid id)
{
   FileItem picture = FileService.GetItem(id);
   return picture != null ? File(picture.FileData, picture.ContentType) : null;
}

如果电子邮件无法在电子邮件客户端中正确呈现,则有一个链接可在浏览器中查看相同的邮件。

在浏览器中,所有图像都正确加载和显示,但我的问题出在电子邮件客户端(在本例中为Outlook 2013和Outlook 2010)中,上面方法引用的图像不会仅加载静态图像。

作为示例,加载精细的图像元素将是静态文件,如:

<img src="http://www.foo.com/es/spacer6.gif" width="1" height="8" border="0" alt="" />

无法正常加载的元素如下:

<img src="http://www.foo.com/Packages/Image/0c6d126d-8f62-4e28-9963-7377e73c0482" style="border-style:solid;border-bottom-width:1;border-right-width:1;border-top-width:1;border-left-width:1;border-color:#333;" alt="..." />

因此,两个来自同一个域只有一个是静态的,一个是通过上面的控制器动作加载的。我猜测Outlook客户端不喜欢这是一个链接到外部“资源”的事实,因为它不知道它是基于URL的图像。

无论如何都要改变我的控制器操作以“欺骗”Outlook认为这只是一个静态图像URL,或者只是一种更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

我使用下一个代码prom puresourcecod.com:

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

...

public ActionResult Hello(string text)
{
    //Create new image
    Image img = new Bitmap(100, 50);
    Graphics g = Graphics.FromImage(img);

    //Do some drawing
    Font font = new Font("Arial", 24);
    PointF drawingPoint = new PointF(10, 10);

    g.DrawString(text, font, Brushes.Black, drawingPoint);

    //Return Image
    MemoryStream ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);

    ms.Position = 0;

    return new FileStreamResult(ms, "image/png");
}

答案 1 :(得分:0)

首先,请确保picture.ContentType包含它应包含的内容(例如&#34; image / png&#34;如果图片是PNG)。

否则,Outlook可能取决于拥有&#39;权利&#39;扩展。要找出你可以为你的guid-URL添加适当的扩展名,然后使用它:

public virtual ActionResult Image(string id)
{
    string s = id.Substring(0, id.IndexOf(".")); // a "." is now required
    Guid guid = Guid.Parse(s);
    FileItem picture = FileService.GetItem(guid);
    return picture != null ? File(picture.FileData, picture.ContentType) : null;
}