轻量级动态WCF客户端

时间:2016-02-04 00:50:42

标签: c# json wcf dynamic connection

我必须使用一些WCF服务,但我不想实现所有必需的类。甚至动态。我想使用WCF服务作为传输,并且只关心对我很重要。

很好的例子是发送带参数的SQL并获得响应。 SQL可能不同,参数不同,当然,响应也不同。有些东西是必需的,有些是静态的,有些是动态的 - 我可以照顾好所有人,但我不想为每个不同的案例创建课程。

让我们举个例子,假设数据以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":""}

困扰我的是为每个请求/响应编写/生成特殊类的必要性。 当然,一般建议是使用带有简单输入/请求的客户端/服务器 - 只包含json的字符串。或者,更好的一个,创建一个足够复杂的通用对象来处理所有可能的情况。然而,即便是第二个例子也表明它有多复杂。最糟糕的部分 - 服务器不是我的区域。我只是消费者,可以得到服务器给我的东西。我可以创建/转换请求以满足服务器需求,但响应应该以最简单的方式呈现。

我的假设是传输是XML,如果它可以在它被转换为对象之前被截获,而是转换为json,那么我可以使用像

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

没有课程答案,行,行。

我有什么建议可以到达那里吗?

1 个答案:

答案 0 :(得分:0)

反思就是答案。基于json的值创建服务对象,基于json调用适当的服务并返回包装到json的回答。 这是一个简单的代码,它将调用任何WCF客户端,调用任何操作,关闭客户端并以字符串形式返回结果:

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;
        }
    }
}

当然会返回

Answer=thub-thub

稍加修改后,它可以调用带参数的动作并返回包含在json中的复杂值。 这个例子简单解释了如何调用和调用任何WCF服务的基本原理。