includeExceptionDetailInFaults=true 在开发环境中有效,但在测试环境中无效

includeExceptionDetailInFaults=true works in dev-environment, but not in test-environment

我有一个 WCF 服务并设置

<serviceDebug includeExceptionDetailInFaults="true" />

当我在我的开发机器上 Visual Studio 中启动服务器时,这很好用。但它在我们的测试服务器上不起作用。

配置片段:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>      
    <behavior name="debug">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true"  />          
    </behavior>        
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
  <service name ="TisCalc.Service.UCLCalc" behaviorConfiguration="debug"></service>
</services>

当客户端用无效请求调用服务器时,我得到这样的错误(这就是我想要的)

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
         <faultstring xml:lang="de-DE">Fehler beim Deserialisieren des Textkörpers der Anforderungsnachricht für Vorgang "Angebot".</faultstring>
         <detail>
            <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
               <HelpLink i:nil="true"/>
               <InnerException>
                  <HelpLink i:nil="true"/>
                  <InnerException>
                     <HelpLink i:nil="true"/>
                     <InnerException i:nil="true"/>
                     <Message>Instanzvalidierungsfehler: 'AT' ist kein gültiger Wert für Land.</Message>
                     <StackTrace>bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUCLCalcInterface.Read13_Land(String s)
   bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUCLCalcInterface.Read14_Adresse(Boolean isNullable, Boolean checkType)
   bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUCLCalcInterface.Read15_Leasinggeber(Boolean isNullable, Boolean checkType)
   bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUCLCalcInterface.Read16_AngebotContext(Boolean isNullable, Boolean checkType)
   bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderUCLCalcInterface.Read33_Item()
   bei Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer.Deserialize(XmlSerializationReader reader)
   bei System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)</StackTrace>
                     <Type>System.InvalidOperationException</Type>
                  </InnerException>
                  <Message>Fehler im XML-Dokument (20,13).</Message>
                  <StackTrace>bei System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   bei System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   bei System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)</StackTrace>
                  <Type>System.InvalidOperationException</Type>
               </InnerException>
               <Message>Fehler beim Deserialisieren des Textkörpers der Anforderungsnachricht für Vorgang "Angebot".</Message>
               <StackTrace><![CDATA[bei System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)
   bei System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
   bei System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
   bei System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)
   bei System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
   bei System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)]]></StackTrace>
               <Type>System.ServiceModel.CommunicationException</Type>
            </ExceptionDetail>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

使用完全相同的服务配置和相同的源对测试环境进行相同的调用returns这个错误 500,我完全不知道为什么...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
      <title>500 - Internal server error.</title>
      <style type="text/css">
         <!--body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}-->
      </style>
   </head>
   <body>
      <div id="header">
         <h1>Server Error</h1>
      </div>
      <div id="content">
         <div class="content-container">
            <fieldset>
               <h2>500 - Internal server error.</h2>
               <h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3>
            </fieldset>
         </div>
      </div>
   </body>
</html>

在 IIS 中我必须做任何配置吗?希望有人能给我提示。

已编辑:附加信息: 通常我会抛出一个带有强类型详细信息的 Faultexception。 但我不想为不符合合同的请求编写处理程序并在反序列化期间导致错误。例如,如果客户端(如我的测试请求)发送无效的 enum-value。 在这种情况下,我想要 "free" 调试信息。在生产中,这种无效请求不会发生。所以我们可以在生产环境中关闭includeExceptionDetailInFaults

你不应该使用 IncludeExceptionDetailInFaults = true 相反,你需要抛出 FaultException. And it is also recommended that you use the FaultContractAttribute 来设计你的服务 return strongly-typed SOAP 错误。