2016-02-04 52 views
0

我必须使用一些WCF服务,但我不想实现所有必需的类。即使动态。我想使用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); 

无需类的答案,行,行。

任何建议如何我可以到那里?

回答

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服务的基本原理的简单解释。