我需要让非托管的Windows C客户端与WCF服务进行对话。C客户端可以在Win2000或更高版本上运行。我可以控制WCF服务和正在使用的C++ API。由于它是用于专有应用程序,因此最好尽可能使用Microsoft的东西,而不是GNU许可的API。那些使用它的人,您能否分享一个如何使其工作的逐步过程?
到目前为止,我已经研究了以下选项:
- WWSAPI -不好,无法在Win 2000客户端上工作。
- ATL Server,使用following guide作为引用。我遵循了概述的步骤(删除策略引用并扁平化WSDL),但是得到的WSDL仍然不能被sproxy使用
还有其他想法吗?只有在你自己真的有效果的情况下才能回答。
编辑1:我为我可能混淆的人道歉:我所寻找的是一种从未安装.NET框架的客户端调用WCF服务的方法,因此不能使用基于. NET的帮助器库,它必须是纯非托管C++
5条答案
按热度按时间yv5phkfx1#
基本思想是用C#为客户端编写WCF代码(这种方式更简单),并使用C桥DLL在非托管C代码和用C#编写的托管WCF代码之间架起差距。
下面是使用Visual Studio 2008和.NET 3.5 SP1的分步过程。
1.首先要做得是创建WCF服务与承载它得方法.如果您已经有了WCF服务与承载它得方法,请跳到下面得步骤7.否则,请按照此处得步骤创建Windows NT服务.使用VS 2008为项目与添加到项目中得任何类提供得默认名称.此Windows NT服务将承载WCF服务.
IHelloService.cs
),类文件(HelloService.cs
)与默认服务配置文件(app.config
)得形式添加到项目中.1.打开Visual Studio 2008的另一个示例并创建一个MFC应用程序,这与WCF几乎是一样的。例如,我只是创建了一个对话框MFC应用程序,并向其添加了一个Say Hello!按钮。在解决方案资源管理器中右键单击该项目,然后选择“属性”菜单选项。在“常规”设置下,将输出目录更改为..\bin\Debug。在“C/C++常规”设置下,将..\HelloServiceClientBridge添加到其他包含目录。在“链接器常规”设置下,将..\Debug添加到其他库目录。单击“确定”按钮。
希望你能从这个简单的例子中推断出适合你的需要。如果这不起作用,请让我知道,这样我就可以修复这个帖子。
hujrc8aj2#
对于那些感兴趣的人,我找到了一个半工作的ATL Server解决方案。下面是宿主代码,注意它使用的是BasicHttpBinding,它是唯一一个与ATL Server一起工作的:
可以在here中找到InlineXsdInWsdlBehavior的代码。需要对InlineXsdInWsdlBehavior进行一个重要更改,以便在涉及复杂类型时,它可以与sproxy一起正常工作。这是由sproxy中的错误引起的,该错误没有正确地限定命名空间别名的范围,因此wsdl不能具有重复的命名空间别名,否则sproxy将崩溃。以下是需要更改的函数:
下一步是生成C++头文件:
然后C++编程看起来像这样:
生成的C++代码可以很好地处理复杂类型,只是不能将NULL赋给对象。
jucafojl3#
我将创建一个C#托管类来执行WCF工作,并将该类作为COM对象公开给C++客户端。
mnemlml84#
您可以使用过时的MS Soap Toolkit轻松地实现SOAP客户端。不幸的是,除了迁移到. NET之外,似乎没有其他替代方法。
zkure5ic5#
您是否可以发布REST Web服务并使用MSXML COM库--应该已经安装,具有XML解析器和HTTP库。
http://msdn.microsoft.com/en-us/library/ms763742.aspx