创建用于记录的web服务

时间:2015-05-28 13:50:21

标签: c# web-services logging asp.net-web-api

我正在尝试创建一个Web服务来处理异步应用程序的所有日志记录,我可以在其中发送两个相同的对象并比较每个属性。然后创建已更改的属性的日志。

我遇到的问题,我不知道apicontroller如何接受任何对象:

这是我到目前为止:

public class PropertyLogApiCall
{
    public string Id { get; set; }
    public string Username { get; set; }
    public string Task { get; set; }
    public object OldEntity { get; set; }
    public object NewEntity { get; set; }
    public string OldEntityType { get; set; }
    public string NewEntityType { get; set; }
}

POST - ApiController

public void Post(PropertyLogApiCall paramList)
{
    try
    {
        var id = paramList.Id;
        var username = paramList.Username;
        var task = paramList.Task;

        var newType = Type.GetType(paramList.NewEntityType);
        var oldType = Type.GetType(paramList.OldEntityType); 

        var newEntity = Convert.ChangeType(paramList.NewEntity, newType);
        var oldEntity = Convert.ChangeType(paramList.OldEntity, oldType);


        var properties = oldEntity.GetType().GetProperties();
        var logsToSave = new List<PropertyLog>();
        var dateTimeStamp = DateTime.Now;

        foreach (var property in properties)
        {
            var oldValue = property.GetValue(oldEntity, null);
            var newValue = newEntity.GetType().GetProperty(property.Name).GetValue(newEntity, null);
            var propertyType = property.PropertyType;
            var name = oldEntity.GetType().Name;
            var propName = property.Name;
            PropertyLog log = null;

            if (propertyType == typeof(string))
            {
                log = CreateLogString(oldValue, newValue);
            }
            else if (propertyType == typeof(int))
            {
                log = CreateLogInt(oldValue, newValue); 
            }

            if (log != null)
            {

                log.Created = dateTimeStamp;
                log.EntityId = id;
                log.Username = username;
                log.EntityName = name;
                log.Property = propName;
                log.Task = task;
                logsToSave.Add(log);
            }

        }
         //Save Logs
         .....
    }
    catch (Exception e)
    {    
        //send email                    
    }

这不起作用,因为大多数时候newType / oldType为null。而且某些实体没有实现IConvertible接口。

这甚至可以吗?

1 个答案:

答案 0 :(得分:0)

正如您所说,在许多场景中您没有对象类型,您需要动态地执行此操作。如果你不知道它的类型,就不可能重新创建一个对象。

将操作的参数更改为dynamic,将动态创建对象,包括请求中的所有属性。然后,您需要逐步浏览OldEntity的所有属性,并将它们与NewEntity上的属性进行比较。如果属性可以是具有附加属性的复杂对象,则必须以递归方式执行此操作。但是,在SO中您可以获得以下信息:How do I enumerate through a JObject?

您可以从此SO Q&amp; A:Comparing dynamic objects in C#获得想法。

或者,如果您将其作为JSON发布,则可以将参数作为JObject接收,并对其进行相同的操作。目前http://www.newtonsoft.com/已关闭,因此我无法向您提供指向JObject文档的确切指针。