轻量级动态 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 服务的基本原理。
我必须使用一些 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 服务的基本原理。