繁体   English   中英

尝试使用WCF服务时获取FaultException

[英]Getting a FaultException when trying to work with a WCF service

编辑:这是我的调用堆栈。

System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(System.ServiceModel.Channels.Message回复,System.ServiceModel.Channels.MessageFault错误,字符串操作,System.ServiceModel.Channels.MessageVersion版本,System.ServiceModel。 Channels.FaultConverter faultConverter)+ 0x124字节
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.HandleReply(System.ServiceModel.Dispatcher.ProxyOperationRuntime操作,参考System.ServiceModel.Dispatcher.ProxyRpc rpc)+ 0x147字节
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.EndCall(字符串操作,对象[]输出,System.IAsyncResult结果)+ 0xb2字节
System.ServiceModel.dll!System.ServiceModel.ClientBase.ChannelBase.EndInvoke(字符串methodName,object [] args,System.IAsyncResult结果)+ 0x1e字节
PhoneClient.dll!PhoneClient.ServiceReference1.Service1Client.Service1ClientChannel.EndGetFirstAidGuides(System.IAsyncResult结果)420行C#PhoneClient.dll!PhoneClient.ServiceReference1.Service1Client.PhoneClient.ServiceReference1.IService1.EndGetFirstAidGuides(System.IAsyncResult结果)第284 + 0x7字节C#PhoneClient.dll!PhoneClient.ServiceReference1.Service1Client.OnEndGetFirstAidGuides(System.IAsyncResult result)行292 + 0x2字节C#System.ServiceModel.dll!System.ServiceModel.ClientBase.OnAsyncCallCompleted(System.IAsyncResult结果)+ 0x20字节
System.ServiceModel.dll!System.ServiceModel.AsyncResult.Complete(bool同步完成)+ 0x66字节
System.ServiceModel.dll!System.ServiceModel.AsyncResult.Complete(bool已同步完成,System.Exception异常)+ 0xe字节
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.CallComplete(bool同步完成,System.Exception异常)+ 0x8字节
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.FinishSend(System.IAsyncResult结果,布尔同步完成)+ 0x99字节
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.SendCallback(System.IAsyncResult结果)+ 0x1a字节
System.ServiceModel.dll!System.ServiceModel.AsyncResult.Complete(bool同步完成)+ 0x66字节
System.ServiceModel.dll!System.ServiceModel.AsyncResult.Complete(bool已同步完成,System.Exception异常)+ 0xe字节
System.ServiceModel.dll!System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnGetResponse(System.IAsyncResult结果)+ 0x52字节
System.Windows.dll!System.Net.Browser.ClientHttpWebRequest.InvokeGetResponseCallback.AnonymousMethod__8(对象状态2)+ 0x1b字节mscorlib.dll!System.Threading.ThreadPool.WorkItem.WaitCallback_Context(对象状态)+ 0x18字节
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executeContext,System.Threading.ContextCallback回调,对象状态)+ 0x63字节
mscorlib.dll!System.Threading.ThreadPool.WorkItem.doWork(对象o)+ 0x47字节mscorlib.dll!System.Threading.Timer.ring()+ 0x70字节

错误:服务器由于内部错误而无法处理请求。 有关错误的更多信息,请打开服务器上的IncludeExceptionDetailInFaults(从ServiceBehaviorAttribute或从配置行为),以便将异常信息发送回客户端,或者根据Microsoft .NET Framework 3.0 SDK文档打开跟踪。并检查服务器跟踪日志。

我目前正在与WCF服务进行通信的Windows Phone 7应用程序上工作。 我已经使其在一种方法中工作了。 所以我认为这是可能的。

这是我的类,它调用WCF服务

public partial class FirstAidGuides : PhoneApplicationPage
{
    public FirstAidGuides()
    {
        InitializeComponent();
        ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client();
        sc.GetFirstAidGuidesCompleted += new EventHandler<ServiceReference1.GetFirstAidGuidesCompletedEventArgs>(sc_GetFirstAidGuidesCompleted);
        sc.GetFirstAidGuidesAsync();
    }

    void sc_GetFirstAidGuidesCompleted(object sender, ServiceReference1.GetFirstAidGuidesCompletedEventArgs e)
    {
        FirstAidGuideText.Text = e.Result[0].Text;
    }
}

现在,我只是想从结果中获取一些文本写入文本块。

这是WCF服务的接口。

[ServiceContract]
public interface IService1
{

    [OperationContract]
    long CreateCall(string phoneNumber, double longtitude, double langtitude);

    [OperationContract]
    List<Model.FirstAidGuide> GetFirstAidGuides();
}

我的服务类的方法,该方法从数据库中提取数据。

public List<Model.FirstAidGuide> GetFirstAidGuides()
    {
        DataClasses1DataContext db = new DataClasses1DataContext();

        var firstAidGuides = (from f in db.FirstAidGuides select f);
        List<Model.FirstAidGuide> list = new List<Model.FirstAidGuide>();

        foreach (var guide in firstAidGuides.ToList())
        {
            Model.FirstAidGuide fa = new Model.FirstAidGuide();
            fa.FirstAidId = guide.FirstAidId;
            fa.Title = guide.FirstAidTitle;
            fa.Text = guide.FirstAidText;
            fa.LastUpdated = (DateTime)guide.LastUpdated;
            list.Add(fa);
        }
        return list;
    }

只是为了方便。 FirstAidGuide类。

[DataContract]
public class FirstAidGuide
{
    [DataMember]
    private string _title;
    [DataMember]
    private string _text;
    [DataMember]
    private DateTime _lastUpdated;
    [DataMember]
    private long _firstAidId;

    public long FirstAidId
    {
        get { return _firstAidId; }
        set { _firstAidId = value; }
    }      

    public DateTime LastUpdated
    {
        get { return _lastUpdated; }
        set { _lastUpdated = value; }
    }     

    public string Text
    {
        get { return _text; }
        set { _text = value; }
    }      

    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }
}

我根本无法做任何事情。 我收到了FaultException,这向我指出了它无法处理WCF服务的响应的方向。

任何帮助,将不胜感激。

您可以尝试在WCF服务上启用跟踪吗,还可以检查跟踪以找出错误是什么吗? 还要设置下面的属性以获得错误的完整堆栈跟踪

<serviceDebug includeExceptionDetailInFaults="true" />

我倾向于通过WCF进行的操作是将所有内容包装在Try...Catch块中的[OperationContract]方法中; 解开所有捕获的异常和所有内部异常的堆栈跟踪,并将其作为字符串粘贴到FaultException的消息中,然后我将其重新抛出肥皂边界。 像这样:

public static string GetDebugString(this Exception ex)
{
   var builder = new StringBuilder();
   GetDebugString(ex, builder);
   while ((ex = ex.InnerException) != null)
   {
      GetDebugString(ex, builder);
   }
   return builder.ToString();
}


private static void GetDebugString(Exception ex, StringBuilder builder)
{
    builder.AppendLine(ex.GetType().Name);
    builder.AppendLine();
    builder.AppendLine(ex.Message);
    builder.AppendLine();
    builder.AppendLine(ex.StackTrace);
    builder.AppendLine();
}

[OperationContract]
public void Foo()
{
    this.MakeSafeCall(() => this.UnsafeFoo());
}

public void Unsafe()
{
    // do stuff
}

private void MakeSafeCall(Action action)
{
    try
    {
       action();
    }
    catch (Exception ex)
    {
       throw new FaultException(ex.GetDebugString());
    }
}

问题出在这一行:

foreach(firstAidGuides.ToList()中的var指南)

显然,调用.ToList()使整个过程崩溃。 只需删除.ToList()即可修复所有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM