如何使用自定义绑定从非托管c++连接到WCF服务
本文关键字:连接 c++ WCF 服务 自定义 何使用 绑定 | 更新日期: 2023-09-27 17:50:31
我需要从本地c++应用程序连接到WCF服务。我尝试了下面的链接,它与wsHttpBinding
一起工作。
为非托管c++客户端创建WCF服务
然而,我需要用自定义绑定连接到WCF服务。这就是自定义绑定代码在我的应用配置文件
中的样子<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<customBinding>
<binding name="ResourceCenterEndpoint5">
<mtomMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
messageVersion="Default" maxBufferSize="65536" writeEncoding="utf-8">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</mtomMessageEncoding>
<httpTransport manualAddressing="false" maxBufferPoolSize="524288"
maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Ntlm"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
keepAliveEnabled="true" maxBufferSize="65536"
proxyAuthenticationScheme="Anonymous"
realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
useDefaultWebProxy="true" />
</binding>
</customBinding>
</binding>
</bindings>
<client>
<endpoint address="http://usaabcxyzas1.na.abc.com/Build15/ReserSVC/Resource.svc"
binding="customBinding" bindingConfiguration="ResourceCenterEndpoint5"
contract="ServiceReference2.ResourceCenterServiceContract"
name="ResourceCenterEndpoint5">
<identity>
<userPrincipalName value="devlts_srv@na.abc.com" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
我有一个桥DLL,这是一个托管的c++ DLL。托管的c++ DLL将c#客户端连接到本机应用程序。但是,我无法从托管的c++ DLL连接到Web服务,因为Web服务正在使用自定义绑定。我得到的错误是:
http请求未经授权,客户端身份验证方案为"匿名"。从服务器接收到的认证头是'Negotiate,NTLM'
这是我试图从托管c++ dll连接到web服务的方式:
Binding^ binding = gcnew BasicHttpBinding();
EndpointAddress^ address = gcnew EndpointAddress(gcnew String("http://usaabcxyzas1.na.abc.com/Build15/ReserSVC/Resource.svc"));
HelloServiceClient::ServiceReference2::ResourceCenterServiceContractClient^ client = gcnew HelloServiceClient::ServiceReference2::ResourceCenterServiceContractClient(binding, address);
client->DoWork();
所以基本上我需要用自定义绑定将托管c++ dll连接到WCF服务。我该怎么做呢?
你试图在客户端代码中使用BasicHttpBinding
在配置文件中你需要NTLM:
authenticationScheme="Ntlm"
错误指向你在服务配置文件中所拥有的内容。
*The http request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the sever was 'Negotiate,NTLM'*
你看起来也像试图入侵
proxyAuthenticationScheme="Anonymous"
所以这取决于您的安全需求。如果您希望服务不具有安全性,只需取出NTLM引用。如果需要安全性,则需要在绑定定义中加入security部分,类似于:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
查看这篇文章了解更多
我不认为你想要自定义绑定,就像你想自定义开箱即用的绑定一样。除非你的意图是创建一个专有的通信协议,在TCP/IP等之外。
对于安全性问题,您可能希望查看设置security。模式属性,以及分配正确的传输和/或消息安全属性。如。使用证书或密码挑战,加密,加密和签名等
您还需要在客户端执行相同的操作。该绑定应该与服务器端的绑定几乎相同。
如果你不喜欢基本的http,还有TCP, MSMQ,命名管道等等。
您是否尝试过使用SvcUtil从web服务生成WSDL ?一旦您有了客户端代理和配置,它将具有客户端连接到服务所需的配置。
你也提到你想使用CustomBinding连接,但在客户端代码中你使用的是BasicHttpBinding。
你需要你的代码设置的另一件事是AuthenticationScheme,因为服务器期望方案NTLM,而你的客户端代码没有设置,默认情况下它是匿名的
这看起来像是一个身份验证错误,所以你需要给自己更多的权限或找出谁得到它,但例如提供用户名和密码。
我维护使用Wcf服务的本地c++应用程序。与其处理原始连接和XML,我建议使用优秀的gSoap库。这将从服务中获取WSDL,并生成使用它进行操作的代码。通过使用http://code.google.com/p/gsoapwininet/插件,所有的通信都是通过IE进行的,这意味着所有各种windows身份验证方法都是自动支持的,这应该可以解决您的特定问题。
您可以创建一个customBinding并传入所需的绑定配置名称。