Пытаюсь сделать WCF сервис в виде приложения (без IIS). Стандартные типы данных возвращает. Но вот пользовательские коллекции нет. Мне нужно получать журнал событий с сервера. Вот что я написал:
[ServiceContract]
public interface IEventLogService
{
// тест, возвращает строку ОК
[OperationContract]
string Test();
//Получить список журнала событий из указаного журнала и типа(Error, Warning)
[OperationContract]
List<LogType> GetDataEventLog(string name, string type);
}
[ServiceBehavior]
public class EventLogService : IEventLogService
{
public string Test()
{
return "OK";
}
public List<LogType> GetDataEventLog(string name, string type)
{
try
{
//создаем объект чтения журнала
using (EventLog log = new EventLog())
{
//инициализация
log.BeginInit();
//выбор раздела журнала
log.Log = name;
if (log.Entries.Count > 0)//если журнал не пустой
{
List<LogType> logs = new List<LogType>();
foreach (System.Diagnostics.EventLogEntry entry in log.Entries)
{
//отбирать только необходимый тип записи журнала
switch (type)
{
case "Error":
if (entry.EntryType != EventLogEntryType.Error)
continue;
break;
case "Warning":
if (entry.EntryType != EventLogEntryType.Warning)
continue;
break;
}
LogType newLog = new LogType()//заполнить запись
{
CategoryField = entry.Category,
EventIDField = entry.EventID,
TimeGeneratedField = entry.TimeGenerated,
SourceField = entry.Source,
UserNameField = entry.UserName,
EntryTypeField = entry.EntryType.ToString()
};
if (entry.Data.Length > 0)
{
// раскодировать
newLog.DataField = System.Text.Encoding.Default.GetString(entry.Data);
}
logs.Add(newLog);
}
// dataGridView1.DataSource = table;
Console.WriteLine("[" + DateTime.Now.ToShortTimeString() + "]\tSome Gringo want see your log");
return logs;
}
else
{
Console.WriteLine("There are no entries in the log.");
return null;
}
}
}
catch (Exception e)
{
Console.WriteLine("[" + DateTime.Now.ToShortTimeString() + "]\t" + e.Message);
return null;
}
}
}
//ну и сам запуск
var host = new ServiceHost(typeof(EventLogService));
host.Open();
Console.WriteLine("Сервис запущен");
Console.ReadKey(true);
Сама пользовательская коллекция
[DataContract]
public class LogType
{
/// <summary>
/// Получает идентификатор события конкретного приложения для текущей записи события.
/// </summary>
int EventID { get; set; }
/// <summary>
/// Получает текст, связанный со свойством CategoryNumber для этой записи.
/// </summary>
string Category { get; set; }
/// <summary>
/// Получает тип события этой записи.
/// </summary>
string EntryType { get; set; }
/// <summary>
/// Получает имя приложения, создавшего это событие.
/// </summary>
string Source { get; set; }
/// <summary>
/// Получает местное время создания события.
/// </summary>
DateTime TimeGenerated { get; set; }
/// <summary>
/// Получает имя пользователя, который является инициатором этого события.
/// </summary>
string UserName { get; set; }
/// <summary>
/// Получает данные, связанные с этой записью.
/// </summary>
string Data { get; set; }
[DataMember]
public int EventIDField
{
get { return EventID; }
set { EventID = value; }
}
[DataMember]
public string CategoryField
{
get { return Category; }
set { Category = value; }
}
[DataMember]
public string EntryTypeField
{
get { return EntryType; }
set { EntryType = value; }
}
[DataMember]
public string SourceField
{
get { return Source; }
set { Source = value; }
}
[DataMember]
public DateTime TimeGeneratedField
{
get { return TimeGenerated; }
set { TimeGenerated = value; }
}
[DataMember]
public string UserNameField
{
get { return UserName; }
set { UserName = value; }
}
[DataMember]
public string DataField
{
get { return Data; }
set { Data = value; }
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости