2009-05-26 7 views
19

私は、Memoryコンテンツ(実際には任意のタイプのストリーム)にコンテンツを直列化するライブラリを使用して、icsファイル(iCalendarまたはRFC 2445またはそれらを呼び出す)を生成しています。FileResult with MemoryStreamは空の結果を返します。何が問題なのですか?

public ActionResult iCal(int id) { 

     MyApp.Event kiEvt = evR.Get(id); 

     // Create a new iCalendar 
     iCalendar iCal = new iCalendar(); 

     // Create the event, and add it to the iCalendar 
     DDay.iCal.Components.Event evt = iCal.Create<DDay.iCal.Components.Event>(); 

     // Set information about the event 
     evt.Start = kiEvt.event_date; 
     evt.End = evt.Start.AddHours(kiEvt.event_duration); // This also sets the duration    
     evt.Description = kiEvt.description; 
     evt.Location = kiEvt.place; 
     evt.Summary = kiEvt.title; 

     // Serialize (save) the iCalendar 
     iCalendarSerializer serializer = new iCalendarSerializer(iCal); 


     System.IO.MemoryStream fs = new System.IO.MemoryStream(); 

     serializer.Serialize(fs, System.Text.Encoding.UTF8); 

     return File(fs, "text/calendar", "MyApp.wyd."+kiEvt.id+".ics"); 
    } 

私の問題は、それが一部のコンテンツが含まれているfsはあるが、コントローラは、空のファイルを返します - 適切なMIMEタイプとファイル名を指定して:

は、ここでは、コードの私の塊です。私はおそらくストリーム処理で何かを見逃していますが、何が分からないのでしょうか。

誰でも私をここで助けることができますか?前もって感謝します。

答えて

41

ストリームを返す前にストリームの先頭に戻ってSeekする必要がありますか?

fs.Seek(0, 0); 
+2

ビンゴ!どうもありがとうございました。 –

+1

ありがとうMatt!これは私に1トンの時間を節約しました。基本的だが簡単に見落とされる。 – jhappoldt

0
iCalendar iCal = new iCalendar(); 
foreach (CalendarItem item in _db.CalendarItems.Where(r => r.Start > DateTime.Now && r.Active == true && r.CalendarID == ID).ToList()) 
{ 
    Event evt = new Event(); 
    evt.Start = new iCalDateTime(item.Start); 
    evt.End = new iCalDateTime(item.End); 
    evt.Summary = "Some title"; 
    evt.IsAllDay = false; 
    evt.Duration = (item.End - item.Start).Duration(); 
    iCal.Events.Add(evt); 
} 
// Create a serialization context and serializer factory. 
// These will be used to build the serializer for our object. 
ISerializationContext ctx = new SerializationContext(); 
ISerializerFactory factory = new DDay.iCal.Serialization.iCalendar.SerializerFactory(); 
// Get a serializer for our object 
IStringSerializer serializer = factory.Build(iCal.GetType(), ctx) as IStringSerializer; 
if (serializer == null) return Content(""); 
string output = serializer.SerializeToString(iCal); 
var contentType = "text/calendar"; 
var bytes = Encoding.UTF8.GetBytes(output); 
var result = new FileContentResult(bytes, contentType); 
result.FileDownloadName = "FileName.ics"; 
return result; 
関連する問題