HTTPプロトコルを使用してIIS7でホストされている単純なWCFサービスがあります。このサービスには、と呼ばれるカスタムオブジェクトを返すメソッドが含まれていますCalendar
。Holidays
このオブジェクトは非常に基本的であり、タイプがである1つのプロパティを除いて、単純な値タイプのプロパティが含まれていますList<IHoliday>
。Holiday
繰り返しますが、値型プロパティのみで構成される単純型です。
オブジェクトはCalendar
WCFサービスメソッドからMVCコントローラーに返され、対応するビューに適用されます。dotTraceを使用したメモリテスト中に、CalendarオブジェクトがGCによってファイナライズされることは明らかですが、興味深いことに、Holidays
空であるそのプロパティはヒープに残ります。
これはパフォーマンスの大きな問題ではなく、32バイトしか使用しませんが、空のリストが破棄されない理由を知りたいと思います。必要に応じて、コードサンプルを提供できます。
以下のソースコードとサービス構成:
public class Calendar : ICalendar
{
[DataMember] private IEnumerable<IHoliday> holidays = new List<IHoliday>();
[DataMember] private IEnumerable<IHolidayNotTaken> holidaysNotTaken = new List<IHolidayNotTaken>();
[DataMember] private IEnumerable<INonInstructionalDay> nonInstructionalDays = new List<INonInstructionalDay>();
[DataMember] private IEnumerable<ISchoolBreak> schoolBreaks = new List<ISchoolBreak>();
}
public class Holiday : IHoliday, IIdentifiable, IDisposable
{
[DataMember(Name = @"date")] [JsonProperty(PropertyName = @"date")] private string date;
[DataMember(Name = @"checked")]
[JsonProperty(PropertyName = @"checked")]
public bool Checked { get; set; }
/// <summary>
/// Gets or sets the end Holiday Id.
/// </summary>
/// <value> The holiday id. </value>
[DataMember(Name = @"id")]
[JsonProperty(PropertyName = @"id")]
public int HolidayId { get; set; }
/// <summary>
/// Gets or sets the end description for the holiday.
/// </summary>
/// <value> The description. </value>
[DataMember(Name = @"description")]
[JsonProperty(PropertyName = @"description")]
public string Description { get; set; }
/// <summary>
/// Gets or sets the date of the holiday.
/// </summary>
/// <value> The holiday date. </value>
[DataMember]
[JsonIgnore]
public DateTime Date { get; set; }
/// <summary>
/// Gets or sets the sort order for the holiday.
/// </summary>
/// <value> The sort order. </value>
[DataMember(Name = @"sortOrder")]
[JsonProperty(PropertyName = @"sortOrder")]
public int SortOrder { get; set; }
/// <summary>
/// Gets the <see cref="IIdentifiable.Type" /> of this instance.
/// </summary>
[DataMember(Name = @"type")]
[JsonProperty(PropertyName = @"type")]
public string Type { get; private set; }
/// <summary>
/// Invoked when this instance is serialising.
/// </summary>
/// <param name="streamingContext"> The streaming context. </param>
[OnSerializing]
private void OnSerialising(StreamingContext streamingContext)
{
date = Date.ToString(@"yyyy-MM-dd");
Type = GetType().ToString();
}
}
サービス方法:
public Domain.Calendar GetCalendarByMember(string externalId)
{
try
{
using (var e = new EPlannerEntities())
{
var memberId = e.Members
.Where(m => m.ExternalId == externalId)
.Select(m => m.MemberId)
.SingleOrDefault();
if (memberId.Equals(0))
{
e.Members.AddObject(new Member { ExternalId = externalId.Trim() });
var calendar = new Domain.Calendar
{
DefaultViewId = 2,
MemberId = memberId,
IsWeekendsVisible = true,
TimeFormatId = 1,
DayBeginTime = new TimeSpan(0, 8, 0, 0),
DayEndTime = new TimeSpan(0, 16, 0, 0),
DateFormatId = 1
};
e.Calendars.AddObject(calendar);
e.SaveChanges();
return calendar;
}
return e.Calendars.Single(c => c.MemberId == memberId);
}
}
catch (Exception exception)
{
throw ErrorManager.FaultException(ExceptionType.Business, (int) CalendarErrorCodes.GeneralError, exception);
}
}
サービス構成:
<services>
<service behaviorConfiguration="CalendarServiceBehavior" name="HMH.ePlanner.Services.Calendar">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPBinding" name="TCPEndPoint" contract="HMH.ePlanner.Services.ICalendar">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="HTTPBinding" name="HttpEndPoint" contract="HMH.ePlanner.Services.ICalendar" />
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="TCPMexEndPoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:808/Calendar.svc" />
</baseAddresses>
</host>
</service>
</services>