includeExceptionDetailInFaults=true适用于开发环境,但不适用于测试环境

本文关键字:适用于 不适用 测试环境 开发 true includeExceptionDetailInFaults 环境 | 更新日期: 2023-09-27 18:02:41

我有一个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>

对具有完全相同服务配置和相同源的测试环境的相同调用返回此错误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中做任何配置吗?我希望有人能给我一个提示。

编辑:附加信息:通常我抛出带有强类型Details的Faultexception。但是我不想为与契约不匹配的请求编写处理程序,从而在反序列化期间导致错误。例如,如果客户端(如我的测试请求)发送无效的enum-value。在这种情况下,我想要"自由"调试。在生产环境中,不会发生此类无效请求。因此我们可以在生产环境中关闭includeExceptionDetailInFaults

includeExceptionDetailInFaults=true适用于开发环境,但不适用于测试环境

您不应该使用IncludeExceptionDetailInFaults = true,而是需要抛出FaultException。并且还建议您使用FaultContractAttribute来设计服务以返回强类型 SOAP错误。