-1

HTTPプロトコルを使用してIIS7でホストされている単純なWCFサービスがあります。このサービスには、と呼ばれるカスタムオブジェクトを返すメソッドが含まれていますCalendarHolidaysこのオブジェクトは非常に基本的であり、タイプがである1つのプロパティを除いて、単純な値タイプのプロパティが含まれていますList<IHoliday>Holiday繰り返しますが、値型プロパティのみで構成される単純型です。

オブジェクトはCalendarWCFサービスメソッドから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>
4

3 に答える 3

1

Holidayこの問題は、リストが。を指定せずにインスタンス化されるという事実に起因しますUpperBound。UpperBoundを指定すると、ガベージコレクション後にオブジェクトがヒープから確実に削除されます。

于 2012-06-14T12:01:13.067 に答える
0

カレンダーの部分クラスを作成し(部分的に必要な場合)、IDisposableインターフェイスを追加して、休日を手動で無効にします。dottraceを再度実行して、同じことが発生するかどうかを確認します。

于 2012-06-13T14:44:18.183 に答える
0

提供されたコードに犯罪者は見当たらないため、あなたの質問に対する答えはありません。

私ができる唯一の推奨事項はSession、ソリューションにセキュリティが必要かどうかを確認することです。

今では一貫性がありません。構成により、TCPを使用するクライアントに対しては有効になり、HTTPに対しては無効になります。

PSbindingConfigurationは構成に含まれていません。すべて投稿しましたか?

于 2012-06-13T15:00:08.407 に答える