Pregunta

Tenemos una gran aplicación mi equipo y yo estamos en vías de desarrollo que contiene un número de WCF NetTCP basada en servicios.El servicio de Windows este sistema se ejecutará en virtud de no ser una cuenta local, pero en lugar de un estándar de usuario de dominio (con privilegios de administrador en los servidores que alojan el servicio).En el medio de comprobación de la conectividad me encontré con un problema en el SSPI error de llamadas.Basado en un par de horas de esta investigación me ha llevado por el camino de que me falta la línea siguiente de mi configuración de cliente:

<identity>
     <userPrincipalName value="MACHINE\user" />
</identity>

El problema con esto es que no uso VS o svcutil para generar un cliente/proxy para este servicio, los servidores proxy se utilizan son completamente escrito en el código y se heredan del Sistema.ServiceModel.ClientBase.Creo que la razón original esta opción fue la elegida fue así, se podría utilizar la misma DataMember objetos que pasan a través de los servicios en cualquiera de los lados de la valla tercero de los grupos no necesitan conectarse a nuestros servicios para que esto no era un problema.

¿Alguien sabe una manera para mí para establecer userPrincipalName en el cliente (código o a través de un config) cuando no tengo los extremos especificados en la norma del sistema.serviceModel de la sección de configuración?

He aquí lo que mis web del lado del cliente.config se parece a la de referencia:

    <system.serviceModel>
    <diagnostics>
        <messageLogging logEntireMessage="true" logMalformedMessages="true"
         logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <behaviors>
        <serviceBehaviors>
            <behavior name="includeExceptions">
                <serviceDebug includeExceptionDetailInFaults="true"/>
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_Default" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="Infinite" sendTimeout="01:00:00" portSharingEnabled="true" transferMode="Buffered" maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
                </security>
            </binding>
        </netTcpBinding>
    </bindings>

</system.serviceModel>
¿Fue útil?

Solución

Creación de sus poderes de forma manual no le impiden de poner la configuración en el archivo de configuración; sólo tiene que exponer la sobrecarga del constructor de la derecha en su clase proxy ClientBase derivado de que los delegados a la constructor justo en ClientBase que lleva el nombre de un punto final a mirar hacia arriba en la configuración.

Dicho esto, se puede llenar, por supuesto, en la identidad a través del código de punto final, sólo tiene que crear el tipo correcto de la clase derivada de EndpointIdentity y adjuntarlo al objeto EndpointAddress que se utiliza cuando se instancia la clase de proxy. Algo como esto:

EndpointIdentity epid = EndpointIdentity.CreateUpnIdentity("user@domain.fqdn");
EndpointAddress epaddr = new EndpointAddress(uri, epid);

MyClient client = new MyClient(epaddr);

Otros consejos

A pesar de que estoy probablemente no responder a su pregunta directamente, usar el mismo DataMember a ambos lados de la valla, que no es necesario para crear los proxies manualmente. Lo que se hace es que se genera utilizando sus poderes svcutil y se pasa en el DLL que tiene su DataMember como / r

por ejemplo

svcutil http://localhost/service/service.svc /r:AssemblyThatHasDataMembers.dll /out:ServiceProxy.cs

Con esto, los tipos DataMember no se repiten en su archivo ServiceProxy.cs. Puede personalizar esta ampliamente por los que pasa WSDL / XSD (primer acercamiento verdadero contrato), personalizar los collectiontypes con / TAC, etc., etc.

Esto le ahorrará muchas horas elaborando manualmente los proxies, y al mismo tiempo evitar problemas como el anterior que puede encontrar, porque todo se convierte en madre de patrón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top