简短版本: 在启用AJAX的WCF服务中引发异常时(除了仅打开闸门并将所有异常详细信息发送回去),是否有建议的方法将错误详细信息返回给客户端?
长版:
我有一个相对简单的启用AJAX的WCF服务,可以使用默认服务代理从客户端调用该服务。我在下面提供了代码段,但我不认为代码本身有什么问题。
我的问题是,如果我在服务中引发异常,则返回给客户端的错误对象总是通用的:
{
"ExceptionDetail":null,
"ExceptionType":null,
"Message":"The server was unable to process the request..."
"StackTrace":null
}
理想情况下,我想根据出了什么问题在客户端上显示不同的错误消息。
一种选择是允许WCF故障中的异常,这将为我提供完整的堆栈跟踪信息以及所有内容,但是我感谢与此有关的安全问题,实际上,这比我需要的信息多得多。我可以通过发送一个描述问题或某些内容的字符串来解决问题,但是我看不到解决方法。
我的服务代码:
[ServiceContract(Namespace = "MyNamespace")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService
{
[OperationContract]
public void DoStuff(string param1, string etc)
{
//Do some stuff that maybe causes an exception
}
}
在客户端上:
MyNamespace.MyService.DoStuff(
param1,
etc,
function() { alert("success"); },
HandleError);
其中“ HandleError”只是一种通用的错误处理方法,将显示有关该错误的详细信息。
编辑: 使用适当的自定义json错误处理程序更新了帖子
<serviceDebug includeExceptionDetailInFaults="true"/>
在您的服务行为中会为您提供所需的所有详细信息。
应用程序中的所有异常都将转换为,JsonError
并使用进行序列化DataContractJsonSerializer
。的Exception.Message
是直接使用。FaultException提供FaultCode,而其他异常则以Faultcode
-1威胁为未知。
FaultException是使用HTTP状态代码400发送的,其他异常是HTTP代码500-内部服务器错误。这不是必需的,因为故障代码可用于确定它是否是未知错误。但是在我的应用程序中很方便。
错误处理程序
internal class CustomErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
//Tell the system that we handle all errors here.
return true;
}
public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)
{
if (error is FaultException<int>)
{
FaultException<int> fe = (FaultException<int>)error;
//Detail for the returned value
int faultCode = fe.Detail;
string cause = fe.Message;
//The json serializable object
JsonError msErrObject = new JsonError { Message = cause, FaultCode = faultCode };
//The fault to be returned
fault = Message.CreateMessage(version, "", msErrObject, new DataContractJsonSerializer(msErrObject.GetType()));
// tell WCF to use JSON encoding rather than default XML
WebBodyFormatMessageProperty wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
// Add the formatter to the fault
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
//Modify response
HttpResponseMessageProperty rmp = new HttpResponseMessageProperty();
// return custom error code, 400.
rmp.StatusCode = System.Net.HttpStatusCode.BadRequest;
rmp.StatusDescription = "Bad request";
//Mark the jsonerror and json content
rmp.Headers[HttpResponseHeader.ContentType] = "application/json";
rmp.Headers["jsonerror"] = "true";
//Add to fault
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
}
else
{
//Arbitraty error
JsonError msErrObject = new JsonError { Message = error.Message, FaultCode = -1};
// create a fault message containing our FaultContract object
fault = Message.CreateMessage(version, "", msErrObject, new DataContractJsonSerializer(msErrObject.GetType()));
// tell WCF to use JSON encoding rather than default XML
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
//Modify response
var rmp = new HttpResponseMessageProperty();
rmp.Headers[HttpResponseHeader.ContentType] = "application/json";
rmp.Headers["jsonerror"] = "true";
//Internal server error with exception mesasage as status.
rmp.StatusCode = System.Net.HttpStatusCode.InternalServerError;
rmp.StatusDescription = error.Message;
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
}
}
#endregion
}
用于安装上述错误处理程序的Web行为
internal class AddErrorHandlerBehavior : WebHttpBehavior
{
protected override void AddServerErrorHandlers(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
base.AddServerErrorHandlers(endpoint, endpointDispatcher);
//Remove all other error handlers
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();
//Add our own
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new CustomErrorHandler());
}
}
json错误数据协定
指定json错误格式。在此处添加属性以更改错误格式。
[DataContractFormat]
public class JsonError
{
[DataMember]
public string Message { get; set; }
[DataMember]
public int FaultCode { get; set; }
}
使用错误处理程序
自托管
ServiceHost wsHost = new ServiceHost(new Webservice1(), new Uri("http://localhost/json"));
ServiceEndpoint wsEndpoint = wsHost.AddServiceEndpoint(typeof(IWebservice1), new WebHttpBinding(), string.Empty);
wsEndpoint.Behaviors.Add(new AddErrorHandlerBehavior());
App.config
<extensions>
<behaviorExtensions>
<add name="errorHandler"
type="WcfServiceLibrary1.ErrorHandlerElement, WcfServiceLibrary1" />
</behaviorExtensions>
</extensions>
本文向大家介绍jQuery Ajax调用WCF服务详细教程,包括了jQuery Ajax调用WCF服务详细教程的使用技巧和注意事项,需要的朋友参考一下 这两天在写基于WCF服务的后台框架,过程中遇到了一些挫折,经过努力全部解决了,在此分享给大家,使用的工具是Visual Studio 2013。 该后台需要支持通过json来传递和接收数据。 首先,说说搭建过程。 第一步:创建WCF服务应用程序项目
问题内容: 我有这个应用程序,它可以在本地运行,并且在部署时可以使用.mdf SQL Express数据库文件(通常用于测试目的)。但是,当我将其更改为可与我们的SQL Server 2008一起使用时,该应用程序可以运行,但该服务无法运行。 例如,如果在页面后面的代码中,我有一个按钮可以向表中添加数据,例如: 我的web.config设置为在该服务器上使用模拟,并且一切运行良好。但是,对于我的服
问题内容: 我正在尝试从WCF服务返回一些JSON。该服务仅从我的数据库返回一些内容。我可以得到数据。但是,我担心JSON的格式。当前,返回的JSON格式如下: 实际上,我希望JSON的格式尽可能整洁。我相信(我可能是不正确的),以干净的JSON表示的相同结果集应如下所示: 我不知道“ d”来自哪里。我也不知道为什么要插入转义字符。我的实体如下所示: 负责返回内容的服务定义为: 如何从WCF服务返
问题内容: 好的,所以我创建了一个测试项目,只是为了验证jQuery AJAX是否可以与asp.net服务一起使用,并且没有问题。我使用了在VS Studio中创建的默认HelloWorld服务。我通过jQuery这样调用服务: 在Default.aspx中: 在TestService.asmx中 然后,我继续进行操作,并完全复制了项目中的所有内容,但它不起作用。我收到500个服务器错误。 我验证
几天来,我们一直遇到一个WCF通信错误,我不知道是什么导致了这个错误。我最初认为这是一个SSL证书问题,但它不是。我还确保只要在web浏览器上输入URL就可以到达endpoint,并且可以查看。我还确保默认的请求大小不会导致这个问题。我确信这些请求小于默认的30MB。 还有什么东西可以防止这种堆栈跟踪错误? 客户端堆栈跟踪: 由于通信失败,WCFDirector获取失败。 因为表单没有正确加载,所
问题内容: 如果PHP脚本在某处失败,是否有办法使PHP返回AJAX错误代码?我正在关注一个教程,并将其输入到我的PHP中: 一切都很好,直到我意识到这是JSON数据。有没有一种方法可以使用标准的$ _POST和返回的HTML数据返回错误(例如,触发jQuery的AJAX 事件? 问题答案: 我不了解jQuery,但是如果它区分成功和失败(HTTP 200 OK vs. HTTP!= 200)Aj