使用web api动态调用类库

时间:2016-06-20 14:18:11

标签: c# json asp.net-web-api reflection

我们在Vb.Net中编写了一个现有的API作为我们的一些客户使用的类库。现在我们希望改变这种方法并公开一个web api,它反过来会调用类库。

这是它的工作原理,用户将方法名,类名,构造函数和方法的参数作为JSON字符串传递。使用反射我们必须根据传入的名称调用类库。我能够实现创建类的实例并执行该方法。问题是传递方法的参数。因为我们在API中接收json对象的参数,如何将这些数据转换为类库中的方法所接受的类型,我们只能在运行时知道它?

[ActionName("invokeapi")]
    [HttpPost]
    public IHttpActionResult InvokeAPI([FromBody]Newtonsoft.Json.Linq.JObject pClientData)
    {
        try
        {
            PostData obj = Newtonsoft.Json.JsonConvert.DeserializeObject<PostData>(pClientData.ToString());
            obj.MethodParameter = Newtonsoft.Json.JsonConvert.DeserializeObject(pClientData.GetValue("methodparam").ToString());

            return Ok();
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }
    }

public class PostData
{
    [DataMember(Name = "classname")]
    public string ClassName { get; set; }

    [DataMember(Name = "methodname")]
    public string MethodName { get; set; }

    [DataMember(Name = "parameters")]
    public string[] Parameters { get; set; }

    [DataMember(Name = "methodparam")]
    public object MethodParameter { get; set; }
}

此处, obj.MethodParameter 中的数据属于JArray类型。我们如何根据从客户端传递的类名(ClassName属性)动态地将其转换为所需类型。

1 个答案:

答案 0 :(得分:1)

当你收到请求时,你只是用对象做某事是不正确的,但是你在运行时调用来处理请求的实际类取决于你的类型请求?

一个建议就是拥有多种API方法。在一个应用程序中,我们不仅会有DoSomething(object parameter)这样的方法,而是根据parameter的类型在运行时确定要做什么。如果我们不在应用程序中执行它,我不确定通过API公开那种接口是否有意义。我们通过调用该方法来指定我们想要调用的方法,而不是通过调用“universal”方法并将参数传递给它来指示我们真正想要调用的方法。

如果您的API的消费者不知道如何实现功能,那也更好。他们只是说他们想做什么。他们不知道用于执行这些功能的类或方法的名称。您的API(与任何其他界面一样)创建抽象。您可以在不更改API的情况下更改实施。

这将是我的第一个建议。这样做,你没有解决问题 - 你让问题消失。

话虽如此:

如果你知道参数需要的类型,你可以这样做 - 为了清晰起见我有点冗长:

var parameterType = typeof(TheParameterType);
var deserialized = JsonConvert.Deserialize(pClientData.GetValue("methodparam").ToString(), 
    parameterType) as TheParameterType;

这将尝试将字符串反序列化为给定类型,以便将其传递给强类型方法。