轻量级动态 WCF 客户端

Lightweight dynamic WCF client

我必须使用一些 WCF 服务,但我不想实现所有必要的 classes。甚至是动态的。我想使用 WCF 服务作为一种传输方式,并且只关心对我来说重要的事情。

很好的例子是发送带参数的 SQL 并得到响应。 SQL 可能不同,参数不同,当然,响应也不同。有些东西是必需的,有些东西是静态的,有些东西是动态的——我可以在我这边处理所有事情,但我不想为每种不同的情况创建 class。

举个例子,假设数据传入JSON.

要求:

{ "program":"sqlSelect", "sql":"select siesta from dual"}

答案:

{"sysdate":"02/03/2016"}

另一个请求

{ "program":"sqlSelect", "sql":"select name from user where id<>:a","a":"alex"} 

回应

{"rows":[{ "name":"Bob"},{"name":"Bill"}], "errorCode":""}

困扰我的是每个 request/response 的 writing/generating 特殊 class 的必要性。 当然,一般的建议是将 client/server 与简单的 input/request 一起使用——仅包含 json 的字符串。或者,更好的方法是创建足够复杂的通用对象来处理所有可能的情况。然而,即使是第二个例子也显示了它可能有多复杂。最糟糕的部分 - 服务器不是我的区域。我只是消费者,可以得到服务器给我的东西。我可以 create/transform 请求以满足服务器需求,但响应应该以最简单的方式呈现。

我的假设是传输是 XML 并且如果它可以在转换为对象之前在某个地方被拦截而不是转换为 json 那么我可以使用像

这样简单的东西
if (answer.errorCode=="") SomeProcess(answer.rows[0].name);

没有 classes Answer,Rows,Row.

有什么到达那里的建议吗?

反思就是答案。根据 json 的值创建服务对象,根据 json 和包装到 json 的 return 答案调用适当的服务。 这是将调用任何 WCF 客户端、调用任何操作、关闭客户端和 return 结果作为字符串的简单代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Web.Script.Serialization;

namespace MyNameSpace
{
    class Json2Wcf
    {
        private static void Main(string[] args)
        {
            Debug.WriteLine(Json2Wcf.CallWcf("{'WcfServiceClass':'MyServiceClient', 'WcfServiceAction':'Heartbeat'}"));
        }

        public static string CallWcf(string json)
        {
            var dict = new JavaScriptSerializer().Deserialize<Dictionary<string, string>>(json);

            Type typeWcfServiceClass = Type.GetType(dict["WcfServiceClass"], true);

            object instanceWcfServiceClass = Activator.CreateInstance(typeWcfServiceClass);

            MethodInfo methodWcfServiceAction = typeWcfServiceClass.GetMethod(dict["WcfServiceAction"]);
            object result = methodWcfServiceAction.Invoke(instanceWcfServiceClass, null);

            typeWcfServiceClass.GetMethod("Close").Invoke(instanceWcfServiceClass, null);

            return "Answer="+result;
        }
    }
}

当然可以 returns

Answer=thub-thub

稍作修改,它就可以调用带有参数的操作,并且 return 包含在 json 中的复杂值。 此示例简单说明如何调用任何 WCF 服务的基本原理。