Pergunta

Temos sim uma grande aplicação que minha equipe e eu estamos em desenvolvimento que contém um número de WCF NetTCP baseadas em serviços.O serviço do Windows este sistema irá ser executado em não ser uma conta local, mas, em vez de um padrão de usuário de domínio (com privilégios de administrador nos servidores que hospedam o serviço).No meio de testes de conectividade, eu me deparei com um problema onde SSPI chamadas de falhas.Com base em algumas horas de pesquisa, isto me levou para o caminho de me falta a seguinte linha do meu cliente config:

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

O problema com esta é que eu não use VS ou svcutil para gerar um cliente/proxy para este serviço - os proxies sendo utilizados são completamente escrito em código e herdam o Sistema.ServiceModel.ClientBase.Eu acredito que o motivo original essa opção foi escolhida, então podemos usar o mesmo DataMember objetos que passam através de serviços em ambos os lados da cerca - terceiro grupos não precisa ligar para os nossos serviços de modo que este não era um problema.

Alguém sabe uma forma de me definir userPrincipalName no cliente (código ou através de um arquivo de configuração) quando eu não tenho pontos de extremidade especificado na norma do sistema.serviceModel seção de configuração?

Aqui está o que o meu web do lado do cliente.config parece para referência:

    <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>
Foi útil?

Solução

Criando seu proxies manualmente não impede você de colocar a configuração no arquivo de configuração;você só precisa expor o direito construtor de sobrecarga no seu ClientBase derivada da classe de proxy de que os delegados para a direito construtor em ClientBase que leva o nome de um ponto de extremidade para olhar na configuração.

O que disse, é claro que você pode preencher com o ponto de extremidade de identidade através de código, você só precisa criar o tipo certo de EndpointIdentity classe derivada e anexá-lo para o EndpointAddress objeto que você usa quando você instanciar a classe proxy.Algo como isto:

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

MyClient client = new MyClient(epaddr);

Outras dicas

Embora eu provavelmente não respondendo directamente à pergunta, para usar a mesma datamember em ambos os lados da cerca, você não precisa criar os proxies manualmente.O que você faz é que você gerar o seu proxies usando svcutil e você passa a dll que tem o seu datamember como /r

e.g

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

Com isso, o datamember tipos não são repetidas em sua ServiceProxy.cs arquivo.Você pode personalizar este extensivamente passando wsdl/xsd (verdadeiro contrato primeira abordagem), personalizar o collectiontypes com /ct, etc, etc.

Isso vai lhe poupar muitas horas manualmente a elaboração de seus prepostos, e ao mesmo tempo evitar problemas como o acima, que você pode encontrar, porque tudo então se torna estoque padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top