2011-07-05 119 views
14

我读过所有有这个阅读,但也许我失去了一些东西(当然,肯定我失去了一些东西,否则这将是已经工作)客户不会赶上普通的FaultException < T >,只有FaultException异常

我要把我的服务器业务层内部的一些异常错误:

public class RfcException : Exception 
{ 
    public RfcException(string _m, Exception _inner) : base(_m, _inner) 
    { } 

    public Dictionary<string, string> ExtendedProperties 
    { 
     get { return extendedProperties; } 
     protected set { extendedProperties = value; } 
    } 

    private Dictionary<string, string> extendedProperties = new Dictionary<string, string>(); 
} 

我离开未处理的服务,但我有一个IErrorHandler赶上并创建一个FaultMessage

public class FaultErrorHandler : BehaviorExtensionElement, IErrorHandler, IServiceBehavior 
{ 
    public bool HandleError(Exception error) 
    { 
     if (!Logger.IsLoggingEnabled()) return true; 
     var logEntry = new LogEntry 
     { 
      EventId = 100, 
      Severity = TraceEventType.Error, 
      Priority = 1, 
      Title = "WCF Failure", 
      Message = string.Format("Error occurred: {0}", error) 
     }; 
     logEntry.Categories.Add("MiddleTier"); 

     Logger.Write(logEntry); 
     return true; 
    } 

    public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault) 
    { 
     if (error is RfcException) 
     { 
     RfcException rfcException = error as RfcException; 
     var serviceFault = new RfcServiceFault(rfcException); 
     var faultException = new FaultException<RfcServiceFault>(serviceFault, new FaultReason(string.Format("System error occurred, exception: {0}", error))); 
     var faultMessage = faultException.CreateMessageFault(); 
     fault = Message.CreateMessage(version, faultMessage, Schema.WebServiceStandard); 
     } 
     else 
     { 
     var faultException = new FaultException<Exception>(error, new FaultReason(string.Format("System error occurred, exception: {0}", error))); 
     var faultMessage = faultException.CreateMessageFault(); 
     fault = Message.CreateMessage(version, faultMessage, Schema.WebServiceStandard); 
     } 
    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { 
     foreach (ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers) 
     { 
     chanDisp.ErrorHandlers.Add(this); 
     }; 
    } 

    public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
    { } 

    public override Type BehaviorType 
    { 
     get { return typeof(FaultErrorHandler); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new FaultErrorHandler(); 
    } 
} 

不需要问,我已经通过调试器确认它已经进入if (error is RfcException)部分,我已经完成了该代码,并且直到最后都没有任何问题。 那的ErrorHandler封装了FaultException<RfcServiceFault>消息,该RfcServiceFault消息是这

[DataContract(Name = "RfcServiceFault", Namespace = "Service.DataTransfer.Rfc")] 
public class RfcServiceFault 
{ 
    public RfcServiceFault(RfcException rfcException) : this((Exception)rfcException) 
    { 
     ExtendedProperties = new Dictionary<string, string>(rfcException.ExtendedProperties); 
    } 

    public RfcServiceFault() 
    { } 

    public RfcServiceFault(Exception regularException) 
    { 
     FaultMessage = regularException.Message; 
     StackTrace = regularException.StackTrace; 
    } 

    public Dictionary<string, string> ExtendedProperties 
    { 
     get { return extendedProperties; } 
     protected set { extendedProperties = value; } 
    } 

    [DataMember] 
    private Dictionary<string, string> extendedProperties = new Dictionary<string, string>(); 

    [DataMember] 
    public string FaultMessage { get; set; } 

    [DataMember] 
    public string StackTrace { get; set; } 
} 

服务具有所有应该有一个WCF服务与faultContract注释:

[ServiceContract(Name = "MyService", Namespace = Schema.WebServiceStandard, SessionMode = SessionMode.Allowed)] 
public interface IMyService 
{ 
    [OperationContract(Name = "GetStuff")] 
    [FaultContract(typeof(RfcServiceFault) , Name="RfcServiceFault", Namespace="Service.DataTransfer.Rfc")] 
    LookupResult GetStuff(); 
} 

现在:在测试客户端,这样一个简单的测试:

try 
{ 
    var result = myService.GetStuff(); 
    Assert.IsTrue(!string.IsNullOrEmpty(result)); 
} 
catch (FaultException<RfcServiceFault> rfcEx) 
{ 
    // OMG FOR THE LIFE OF THE PUPPIES ENTER HERE 
} 
catch (FaultException rr) 
{ 
    // it always falls in here 
} 
catch (Exception ex) 
{ } 

我读过很多,这个类似的问题很多职位:

但没有到目前为止似乎帮助,我试图建立WCF的跟踪web.config:

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing"> 
     <listeners> 
      <add name="log" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\Traces.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

我在那里得到一个svclog文件,我用WCF Trace查看器打开,但我只看到一堆消息,黄色的显示异常,但它只确认客户端已经看到什么,正在接收一个System.ServiceModel.FaultException ,而不是通用的

任何想法如何弄清楚这一点?

编辑忘了提,我使我的错误处理程序的配置是这样的:

<behaviorExtensions> 
    ..... 
    <add name="faultErrorHandlerBehavior" 
     type="Service.FaultErrorHandler,Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    ..... 
</behaviorExtensions> 
<serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
     <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="200" 
          maxConcurrentInstances="200" /> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <faultErrorHandlerBehavior /> 
    </behavior> 
</serviceBehaviors> 
+0

我会尝试 – lurscher

+3

您正试图解决在同一时间太多的问题从业务故障评论字典属性。你可以删除你的IErrorHandler,并简单地使用一些新的CustomFault,除了字符串之外没有任何额外的属性? –

+0

@亨克,删除字典似乎并没有改善的情况 – lurscher

回答

14

(这是一个在黑暗中位刺的),我相信你可能有一个问题,因为在行动该错误与客户预期的不符。你能请通过以下方式替换您的CreateMessage:

fault = Message.CreateMessage(version, faultMessage, faultException.Action); 
+5

感受到力量,你是WCF Jedi!正如OWK所说:“你的眼睛可以欺骗你,不要相信他们。” – lurscher

+0

谢谢lurscher。很高兴听到它解决了这个问题。 –

+1

这篇文章的thx,我已经解决了这个问题,顺便说一下,你需要注意:当你添加** [FaultContract(typeof(RfcServiceFault))] **属性时,你必须**在客户端重新使用**服务方 – Gavin

相关问题