簡體   English   中英

如何使用非托管C ++中的自定義綁定連接到WCF服務

[英]How to connect to a WCF service with Custom Binding from unmanaged C++

我需要從本機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#Client連接到本機應用程序。 但是,由於Web服務使用自定義綁定,因此無法從托管C ++ DLL連接到Web Service。 我得到的錯誤是:

使用客戶端身份驗證方案“匿名”未授權http請求。 從服務器收到的身份驗證標頭是“Negotiate,NTLM”

這就是我嘗試從manged C ++ dll連接到Webservice的方法:

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 mode="TransportCredentialOnly">
              <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
              <message clientCredentialType="UserName" algorithmSuite="Default" />
            </security>

請看這篇文章了解更多

我不認為你想要自定義綁定,因為你想要自定義開箱即用的綁定。 除非您打算在TCP / IP之外創建一個專有的通信協議。

對於安全性問題,您可能需要查看設置Security.Mode屬性以及分配正確的傳輸和/或消息安全性屬性。 例如。 使用證書或密碼質詢,加密,加密和簽名等。

您還需要在客戶端執行相同的操作。 綁定應該與服務器端的綁定幾乎相同。

如果你不喜歡basicHttp,總會有TCP,MSMQ,名為管道等等。 你應該查找它以獲得完整列表。

您是否嘗試使用SvcUtil從Web服務生成WSDL。 一旦你有了客戶端代理和配置,它將具有客戶端連接到服務所需的配置。

您還提到要使用CustomBinding進行連接,但在使用BasicHttpBinding的客戶端代碼中。

您需要設置代碼的另一件事是AuthenticationScheme,因為服務器期望方案NTLM並且您的客戶端代碼沒有設置它,並且默認情況下它是匿名的。

這看起來像是一個身份驗證錯誤,所以你需要oto給自己更多的權限或找出誰得到它,但例如提供用戶名和密碼。

我維護使用Wcf服務的本機c ++應用程序。 我會建議使用優秀的gSoap庫,而不是處理原始連接和XML。 這將從服務中獲取WSDL並生成用於操作的代碼。 通過使用http://code.google.com/p/gsoapwininet/插件,所有通信都通過IE進行定向,這意味着將自動支持所有各種Windows身份驗證方法,這將解決您的具體問題。

您可以創建customBinding並傳入所需的綁定配置名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM