C# wcf rest ierrorhandler webfaultexception
我有一个WCF4REST服务,它将由java客户端和c#mvc3客户端使用。响应内容需要作为json返回 我希望能够以一致的方式将任何异常/故障返回给客户端。我读到应该使用WebFaultException,它确实工作得很好 但是,我不希望WebFaultExceptions污染我的应用程序逻辑项目,因为它可能被非web项目使用 因此,我研究了在WCF Rest服务中实现IErrorHandler以捕获任何异常,然后针对特定异常(即ValidationException),将异常作为错误包装在WebFaultException中返回。然而,这似乎不起作用,当调用FormFiddler时,我得到以下HTTP504响应 [Fiddler]ReadResponse()失败:服务器未对此请求返回响应 我已经将代码简化为它的骨架,以显示我正在做的事情的本质C# wcf rest ierrorhandler webfaultexception,c#,json,wcf,rest,ierrorhandler,C#,Json,Wcf,Rest,Ierrorhandler,我有一个WCF4REST服务,它将由java客户端和c#mvc3客户端使用。响应内容需要作为json返回 我希望能够以一致的方式将任何异常/故障返回给客户端。我读到应该使用WebFaultException,它确实工作得很好 但是,我不希望WebFaultExceptions污染我的应用程序逻辑项目,因为它可能被非web项目使用 因此,我研究了在WCF Rest服务中实现IErrorHandler以捕获任何异常,然后针对特定异常(即ValidationException),将异常作为错误包装在W
public void ProvideFault(Exception error,
MessageVersion version,
ref Message fault)
{
var ex = new WebFaultException<Exception>(
new Exception("you can't do that"),
HttpStatusCode.Unauthorized);
var xmf = ex.CreateMessageFault();
fault = Message.CreateMessage(version,
null,
xmf,
new DataContractJsonSerializer(xmf.GetType()));
}
public默认值(异常错误,
消息版本,
ref信息故障)
{
var ex=新的WebFaultException(
新的例外(“你不能那样做”),
HttpStatusCode.Unauthorized);
var xmf=ex.CreateMessageFault();
fault=Message.CreateMessage(版本,
无效的
xmf,
新的DataContractJsonSerializer(xmf.GetType());
}
我做错了什么?这是来自的示例代码。过去它帮助了我
public class ValidationAwareErrorHandler : IErrorHandler
{
IErrorHandler originalErrorHandler;
public ValidationAwareErrorHandler(IErrorHandler originalErrorHandler)
{
this.originalErrorHandler = originalErrorHandler;
}
public bool HandleError(Exception error)
{
return error is ValidationException || this.originalErrorHandler.HandleError(error);
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
ValidationException validationException = error as ValidationException;
if (validationException != null)
{
fault = Message.CreateMessage(version, null, new ValidationErrorBodyWriter(validationException));
HttpResponseMessageProperty prop = new HttpResponseMessageProperty();
prop.StatusCode = HttpStatusCode.BadRequest;
prop.Headers[HttpResponseHeader.ContentType] = "application/json; charset=utf-8";
fault.Properties.Add(HttpResponseMessageProperty.Name, prop);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
}
else
{
this.originalErrorHandler.ProvideFault(error, version, ref fault);
}
}
class ValidationErrorBodyWriter : BodyWriter
{
private ValidationException validationException;
Encoding utf8Encoding = new UTF8Encoding(false);
public ValidationErrorBodyWriter(ValidationException validationException)
: base(true)
{
this.validationException = validationException;
}
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
{
writer.WriteStartElement("root");
writer.WriteAttributeString("type", "object");
writer.WriteStartElement("ErrorMessage");
writer.WriteAttributeString("type", "string");
writer.WriteString(this.validationException.ValidationResult.ErrorMessage);
writer.WriteEndElement();
writer.WriteStartElement("MemberNames");
writer.WriteAttributeString("type", "array");
foreach (var member in this.validationException.ValidationResult.MemberNames)
{
writer.WriteStartElement("item");
writer.WriteAttributeString("type", "string");
writer.WriteString(member);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndElement();
}
}
}
我以前看过Carlos的解决方案,如果我们实现IErrorHandler,我们基本上必须手工编写消息,而使用服务direct的WebFaultException为我们做了很多事情,例如json/xml格式,这似乎有点奇怪。mvc应用程序过去也能够捕获FaultException(它以前是一个Soap服务),但我不确定现在如何捕获它们?WebFaultException源自FaultException,并实现了一个新的接口IFaultExecution。WCF 4.0就是这样修改的(在3.5中缺失)。IErrorHandler使您能够显式控制生成的SOAP错误。将其用于RestService不是正确的方法。为了获得更好的Rest支持,请使用新的Aspnet WebApi。在项目的这个阶段迁移到WebApi恐怕不是一个选项。因此,如果我使用Carlos的解决方案,是否有一种简单/可接受的方法来捕获mvc应用程序中的异常?这取决于您如何调用您的服务。。。使用restful服务,您只需创建一个HttpWebRequest。如果出现错误,RESTful实践希望我们在响应中设置HTTP状态代码,以大致分类请求失败的原因。因为状态代码可能不够,应在响应文本中添加明显的详细信息项。但请记住,webfaultexception也可以用于非REST端点,其行为类似于常规FaultException。使用WCF REST端点时,序列化故障的响应格式与非故障响应的确定方式相同。有关WCF REST格式的更多信息,您是否了解过如何使用IErrorHandler中的WebFaultException?