我必须使用一些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 :(得分: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服务的基本原理。