Pergunta

Eu queria criar um método unidirecional para o serviço WCF.Tudo está ok, a menos que Quero retornar a mensagem de falha - se houver.

Estou usando o gerador de código azul wscf para arquivos wsdl e de contrato.

No elemento de operação wsdl, tenho apenas elementos filhos 'Input' e 'Fault'.Quando executo o serviço recebi a informação que não pode declarar mensagem de falha na comunicação unidirecional e ..uma das soluções é definir unidirecional como falso.o que eu fiz e bem, funciona bem.Se ocorrer um erro, recebo a mensagem.

No entanto, estou me perguntando se quebrei as regras de criação de serviço web/wsdl ...Porque a partir do gerador de esquema de serviço wsdl cria para mim uma comunicação unidirecional (definida como 'true') e outros geradores em outras linguagens de programação provavelmente fariam o mesmo ...

Então está correto o que eu fiz?Como posso alterar o wsdl para que o gerador possa criar o código adequadamente?

Se, em teoria, não posso usar falha na comunicação unidirecional, preciso de estrutura extra na resposta para retornar algum erro?

Obrigado!

Foi útil?

Solução

É verdade que operações unidirecionais não podem retornar falhas aos clientes.Se você deseja gerar um void não unilateral operação de serviço no WCF você terá que adicione um elemento de saída vazio para essa operação em seu contrato WSDL.

Os analisadores WSDL baseados em .NET (como WSCF.azul e svcutil) gerará operações de serviço unidirecionais para <wsdl:operation> elementos que não tem um correspondente <wsdl:output> elemento.

Por exemplo, esta operação WSDL é unidirecional:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

Por outro lado, definir uma operação com um valor vazio <wsdl:output> elemento (ou seja, um tipo XSD contendo um sequência vazia) será mapeado para um void não unilateral método em .NET, que pode conter opcionalmente uma declaração de falha:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
           <wsdl:output message="tns:FooResponse" />
           <wsdl:fault message="tns:FooFault" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

onde o <tns:FooResponse> tipo é simplesmente definido como:

<xs:element name="FooResponse">
    <xs:complexType>
        <xs:sequence/>
    </xs:complexType>
</xs:element>

Outras dicas

No WCF, a operação unidirecional não tem valores retornados e o cliente não se importa com o sucesso ou falha da invocação.

No WCF, também temos algumas outras operações que são naturalmente unidirecionais, como você opera o MSMQ via WCF, então as operações são normalmente definidas como unidirecionais.

Então, se você quiser devolver algo para indicar o status de invocação, então unidirecional não é uma escolha correta, você pode apenas usar a operação WCF normal que não é unidirecional.

Para operação unidirecional, aqui está um artigo para sua referência wcf one-way

Eu sinto que você fez a coisa correta.Para qualquer tipo de cliente (C #, Java, C ++, PHP) eles só precisam do WSDL para criar o proxy.Eu sinto que deve funcionar em outras línguas também.Melhor usar o Soapui (Neutro Soap Client) para testar seu serviço.

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