O WCF HTTP/SOAP, Webservice Retornar a mensagem de exceção em falhas
-
14-11-2019 - |
Pergunta
Eu tenho asimple WCF HTTP/SOAP web service, o serviço de implementação é algo como isto:
public CustomResponse DoSomething(CustomRequest request)
{
try
{
return InternalGubbins.WithErrorHandling.ProcessRequest(request);
}
catch
{
// Some sort of error occurred that is not gracefully
// handled elsewhere in the framework
throw new SoapException("Hmmm, it would seem that the cogs are meshed!", SoapException.ServerFaultCode);
}
}
Agora, se o que SoapException é lançada eu gostaria que a mensagem de exceção (por exemplo, Hmmm, it would seem that the cogs are meshed!
) a ser retornado para o cliente invoca, sem qualquer excepção adicionais de detalhe (por exemplo,rastreamentos de pilha).
Se eu definir includeExceptionDetailInFaults
para true (web.configuração no servidor), o total de exceção, com rastreamentos de pilha, etc, é o retorno para o cliente.No entanto, se eu definida para false, recebo uma mensagem genérica:
O servidor não pôde processar a o pedido devido a um erro interno.Para mais informações sobre o erro, ou ligue IncludeExceptionDetailInFaults (ou a partir de ServiceBehaviorAttribute ou a partir de a configuração comportamento) no servidor, a fim de enviar as informações de exceção de volta para o cliente, ou ativar o rastreamento, como por a Microsoft .NET Framework 3.0 SDK documentação e inspecionar o servidor logs de rastreamento.
Então a pergunta é, como posso obter o meu SoapException mensagem de volta para o cliente invoca?eu.e:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher/fault</a:Action>
<a:RelatesTo>urn:uuid:185719f4-6113-4126-b956-7290be375342</a:RelatesTo>
</s:Header>
<s:Body>
<s:Fault>
<s:Code>
<s:Value>s:Receiver</s:Value>
<s:Subcode>
<s:Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</s:Value>
</s:Subcode>
</s:Code>
<s:Reason>
<s:Text xml:lang="en-GB">Hmmm, it would seem that the cogs are meshed!</s:Text>
</s:Reason>
</s:Fault>
</s:Body>
</s:Envelope>
Solução
Eu acho que você precisa declarar um FaultContract sobre o funcionamento e utilização FaultException (SoapException é pré WCF).Eu acredito que o WCF não envia falhas de volta para o cliente, se eles não fazem parte do contrato de serviço.Eu nunca tentei SoapException mas, certamente, jogando um FaultException sempre funcionou bem para mim.
[ServiceContract()]
public interface ISomeService
{
[OperationContract]
[FaultContract(typeof(MyFault))]
CustomResponse DoSomething(CustomRequest request)
}
public class SomeService
{
public CustomResponse DoSomething(CustomRequest request)
{
...
throw new FaultException<MyFault>(new MyFault());
}
}
Outras dicas
Se você não quiser definir um tipo de exceção personalizada, em seguida, tente isso
try
{
return InternalGubbins.WithErrorHandling.ProcessRequest(request);
}
catch
{
throw new FaultException("Hmmm, it would seem that the cogs are meshed.");
}
Isso iria enviar a seguinte resposta para o cliente
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring xml:lang="en-US">Hmmm, it would seem that the cogs are meshed.</faultstring>
</s:Fault>
</s:Body>
</s:Envelope>