为WCF服务提供故障状态

时间:2016-06-13 19:03:26

标签: c# web-services wcf httpresponse

我有一个WCF服务,我用以下方式调用:

MyService client = new MyService();
bool result = client.MyServiceMethod(param1, param2);

将变量result设置为true或false以指示成功或失败。如果成功,很明显,但如果失败,我需要了解失败的一些细节。

从我的服务中我使用

OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
response.StatusCode = HttpStatusCode.BadRequest;
response.StatusDescription = "Invalid parameter.";
return false;

我的问题是如何检索响应描述,这是提供失败反馈的正确方法吗?

2 个答案:

答案 0 :(得分:0)

通常,您使用SOAP MSDN:Faults向客户端传达问题。故障的特殊优势在于WCF将在收到故障消息后确保您的通道保持打开状态。默认情况下,该服务不会发送任何解释所发生情况的信息。 WCF没有透露内部服务的详细信息。有关详细信息,请参阅MSDN:Specifying and Handling Faults in Contracts and Services。另请参阅SO:What exception type should be thrown with a WCF Service?

出于调试目的,您可以添加ServiceDebug行为并将IncludeExceptionDetailInFaults设置为true以获取堆栈跟踪(在非生产环境中)

答案 1 :(得分:0)

IMO最好定义一个自定义类,然后从您的方法返回。该类将包含任何错误的详细信息。您可以使用DataContracts执行此操作。

简化示例可能是这样的......

[ServiceContract]
public interface IMyContract
{
    [OperationContract]
    MyResult DoSomething();
}

[DataContract]
public class MyResult
{
    [DataMember]
    public bool IsSuccess { get; set; }

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


public class MyService : IMyContract
{
    public MyResult DoSomething()
    {
        try
        {
            return new MyResult { IsSuccess = true };
        }
        catch
        {
            return new MyResult { IsSuccess = false, ErrorDetails = "Bad things" };
        }
    }
}

编辑:包括每条评论的消费代码。

var client = new MyService();
var results = client.DoSomething();

if (results.IsSuccess)
{
    Console.WriteLine("It worked");
}
else
{
    Console.WriteLine($"Oops: {results.ErrorDetails}");
}