我有一个支持AJAX的WCF服务(行为中包含enableWebScript),它有一个我创建的ValidationFault。
这是服务:
[ServiceContract]
public interface ICoreWCF
{
/// <summary>
/// Saves the Customer.
/// </summary>
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[FaultContract(typeof(ValidationFault))]
void Customer_Save(Customer customer);
}
这是错误:
[DataContract]
public class ValidationFault
{
[DataMember(Name = "success")]
public bool Success { get; set; }
[DataMember(Name = "msg")]
public string ValidationMessage { get; set; }
[DataMember(Name = "errors")]
public Dictionary<string, string> Errors { get; set; }
}
我想将此错误发送回客户端javascript。 问题是我的自定义错误的DataMembers被忽略,并返回一般异常。
如何将错误集合发送给客户?
我已经尝试编写自己的IErrorHandler,类似于this,因此它使用异常处理应用程序块将异常转换为错误,然后IErrorHandler序列化生成的错误。但似乎WebScriptingEnablingBehavior的JsonErrorHandler与生成的Message对象的处理效果不佳。
感谢。
答案 0 :(得分:0)
您可以添加RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json
试试吧
答案 1 :(得分:0)
如果您已实现IErrorHandler
并使用从WebHttpBehavior
继承的自定义行为将其与服务相关联,那么您可能应该尝试添加默认请求/响应格式等。例如,
private class CustomWebScriptBehavior : WebHttpBehavior
{
protected override void AddServerErrorHandlers(ServiceEndpoint endpoint,
System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
// clear current error handlers
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
// add our error handler
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(
new ErrorHandler(true));
}
private WebMessageFormat _requestFormat;
private WebMessageFormat _responseFormat;
public CustomWebScriptBehavior()
{
_requestFormat = _responseFormat = WebMessageFormat.Json;
}
public override bool AutomaticFormatSelectionEnabled
{
get { return false; }
set { throw new NotSupportedException(); }
}
public override WebMessageBodyStyle DefaultBodyStyle
{
get { return WebMessageBodyStyle.WrappedRequest; }
set { throw new NotSupportedException(); }
}
public override WebMessageFormat DefaultOutgoingRequestFormat
{
get { return _requestFormat; }
set { _requestFormat = value; }
}
public override WebMessageFormat DefaultOutgoingResponseFormat
{
get { return _responseFormat; }
set { _responseFormat = value; }
}
}
这将消除为每个方法指定WebInvoke属性的需要。