c# c++ wcf c++-cli

c# - Cómo conectarse a un servicio WCF con enlace personalizado desde C++ no administrado



c++-cli (6)

¿Has intentado generar WSDL desde el servicio web con SvcUtil? Una vez que tenga el proxy del cliente y la configuración que tendrá la configuración necesaria para que el cliente se conecte al servicio.

También mencionó que desea conectarse mediante CustomBinding, pero en el código de cliente está utilizando BasicHttpBinding.

Una cosa más que necesita que su código establezca es el AuthenticationScheme, ya que el servidor espera el esquema NTLM y su código de cliente no lo establece y, de manera predeterminada, es Anónimo.

Necesito conectarme a un servicio WCF desde una aplicación C ++ nativa. wsHttpBinding el siguiente enlace y funcionó con wsHttpBinding .

Crear servicio WCF para clientes C ++ no administrados

Sin embargo, necesito conectarme a un servicio WCF con un enlace personalizado. Así es como se ve el código para el Enlace personalizado en el archivo de configuración de mi aplicación

<?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="[email protected]" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>

Tengo una DLL de puente que es una DLL de C ++ administrada. La DLL administrada de C ++ conecta el cliente C # a la aplicación nativa. Sin embargo, no puedo conectarme al servicio web desde la DLL administrada de C ++, ya que el servicio web usa enlaces personalizados. El error que recibo es:

La solicitud http no está autorizada con el esquema de autenticación del cliente ''Anónimo''. El encabezado de autenticación recibido del servidor era ''Negociar, NTLM''

Así es como traté de conectarme al servicio web desde la dll C ++ administrada:

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();

Así que, básicamente, necesito conectar el dll C ++ administrado al Servicio WCF con enlace personalizado. ¿Cómo puedo hacer esto?


Está intentando usar BasicHttpBinding en su código de cliente.

En el archivo de configuración necesita NTLM:

authenticationScheme="Ntlm"

El error te indica lo que tienes en el archivo de configuración del servicio.

*The http request is unauthorized with client authentication scheme ''Anonymous''. The authentication header received from the sever was ''Negotiate,NTLM''*

También parece que has intentado hackear

proxyAuthenticationScheme="Anonymous"

Por lo tanto, se trata de sus requisitos de seguridad. Si desea que el servicio no tenga seguridad, solo elimine la referencia NTLM. Si desea seguridad, necesitará una sección de seguridad en su definición de enlace, algo así como:

<security mode="TransportCredentialOnly"> <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security>

Mira este artículo para más


Esto me parece un error de autenticación, por lo que necesita otorgar más permisos o averiguar quién puede obtenerlo, pero, por ejemplo, proporciona un nombre de usuario y una contraseña.


Mantengo aplicaciones c ++ nativas que consumen servicios Wcf. En lugar de tratar con las conexiones en bruto y XML, recomendaré el uso de la excelente biblioteca gSoap. Esto toma el WSDL de un servicio y genera código para operar con él. Al utilizar el http://code.google.com/p/gsoapwininet/ plug-in, todas las comunicaciones se dirigen a través de IE, lo que significa que todos los métodos de autenticación de Windows se admiten automáticamente, lo que debería resolver su problema específico.


No creo que desee un enlace personalizado, tanto como quiera personalizar las fijaciones listas para usar. A menos que tu intención fuera crear un protocolo de comunicación propietario, fuera del TCP / IP, etc.

Para el problema de seguridad, debería considerar establecer las propiedades de Security.Mode así como asignar las propiedades correctas de seguridad de transporte y / o mensaje. p.ej. utilizar certificado o desafío de contraseña, encriptar, encriptar y firmar, etc.

También deberá hacer lo mismo en el lado del cliente. El enlace debe ser casi idéntico al del lado del servidor.

Si no te gusta basicHttp, siempre hay TCP, MSMQ, con un nombre canalizado y así sucesivamente. Debes buscarlo para obtener la lista completa.


Puede crear un Enlace personalizado y pasar el nombre de configuración de enlace requerido.