我有一个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;
我的问题是如何检索响应描述,这是提供失败反馈的正确方法吗?
答案 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}");
}