Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向Silverlight公开第三方接口(通过WCF)_C#_Silverlight_Wcf_Remoting - Fatal编程技术网

C# 向Silverlight公开第三方接口(通过WCF)

C# 向Silverlight公开第三方接口(通过WCF),c#,silverlight,wcf,remoting,C#,Silverlight,Wcf,Remoting,我搜索了很多,如果我错过了一些明显的东西,我会道歉。感谢您阅读下面的长篇文字 我有一个第三方阅读:没有办法在这里访问/更改源应用程序。它由一个服务器Windows服务和一个API组成,通过远程处理与服务器通信。 出于几个原因,我希望通过WCF公开此API,请参阅主题:一个原因是WCF客户端 问题是,API是 不可更改遵循第三方规则 不使用WCF本身,在远程处理需要时,它是可序列化的/MarshalByRef 使用大量接口和内部实现类 下面是1,我自己不能使用非常侵入性的WCF属性 遵循2,API

我搜索了很多,如果我错过了一些明显的东西,我会道歉。感谢您阅读下面的长篇文字

我有一个第三方阅读:没有办法在这里访问/更改源应用程序。它由一个服务器Windows服务和一个API组成,通过远程处理与服务器通信。 出于几个原因,我希望通过WCF公开此API,请参阅主题:一个原因是WCF客户端

问题是,API是

不可更改遵循第三方规则 不使用WCF本身,在远程处理需要时,它是可序列化的/MarshalByRef 使用大量接口和内部实现类 下面是1,我自己不能使用非常侵入性的WCF属性

遵循2,API本身可以在线使用,它们支持通过TCP和HTTP进行远程处理,但远程处理对我来说还不够好

接下来的3个我有很多WCF不能很好处理的接口,不能反序列化。可以发送实现类,但是-我无法访问它们

此API的一般用法基于单个接口及其成员/属性,因此典型用法如下

var entryPoint = new ApiClientEntryPoint();
entryPoint.SomeMethodCall();
entryPoint.PropertyExposingAnInterface.SomeOtherMethodCall();
等等

我真正想做的是尽可能少地生成一个代理,而不是我通过WCF公开的典型WCF意义上的代理,并序列化这个层次结构,将客户端上的每个调用/属性映射到服务器上的真实对象

到目前为止,我遇到的最接近的工具是绊脚石,但我想知道是否有更多/其他可用的工具可以将这项工作的大部分从我的肩上卸下


如果有任何其他建议,更好的方法将预先存在且不可更改的内容包装到WCF中,请分享。

我的建议是使用外观模式。创建特定于您的使用情况的新WCF服务,并包装第三方服务。客户会与您的服务人员交谈,您也会与第三方交谈。但客户不会直接与第三方交谈

这将适用于大多数情况,但并非所有情况。我不确定你的具体情况

顺便说一句,您可以看看WCF RIA服务,它有助于将服务公开给Silverlight,从而避免对服务内容进行大量手工编码。但是,根据您的具体情况,这可能不是最好的方式

编辑: 现在很明显,为了有效地使用facade,API太大和/或客户端的使用模式太多样化。我唯一能建议的另一件事是看看如何使用代码生成工具。假设反射是.NETAPI,是否使用反射?分离API,然后使用您收集的详细信息编码新服务。您可以查看内置在VisualStudio中的T4模板,也可以查看更强大的工具,如CodeSmith。但我猜这将是一些痛苦的代码编写。我不知道有没有一个自动化的解决方案


API是否有良好的文档记录?如果是,文档是否采用可解析格式,如XML或结构良好的HTML?在这种情况下,您可能能够从文档中编码gen,而不是通过代码进行反射。这可能会更快,具体取决于具体情况。

好的,我这边有一个头脑简单的方案1:

使用Visual Studio重构菜单提取“ApiClientEntryPoint”上的界面。 创建一个新的WCF服务,该服务实现上述接口,并获取VS来为您生成方法存根。 '对于PropertyExposingInterface.SomeOtherMethodCall',您必须展平接口,因为没有嵌套服务操作的概念。
您唯一的其他选择将是使用T4代码gen,这可能需要比上述想法更长的时间

这正是我想要避免的:这个api的表面相当大。我可以将其限制为单个SL客户机,但这不会公开整个API,也不会是可重用的。按照您的建议手动代理所有内容太多了。我需要自动生成的帮助。RIA服务:不确定,我会检查一下。但我上次检查时,它似乎是以数据库为中心的。RIA服务不是以数据库为中心的。您可以使用它公开任何.NET对象。但是,如果API太大,无法使用特定方法进行代理,那么这对您没有帮助。当门面不起作用时,我会编辑我的答案,给你一些建议。谢谢你的跟进。是的,API是基于.Net的。是的,我可以尝试生成类似的东西,这似乎是唯一的选择。我想,把这件事留到下一天,然后我会接受我的命运。是的,我不羡慕你的地位。祝你好运