gpt4 book ai didi

asp.net - 从启用 AJAX 的 WCF 服务返回错误详细信息

转载 作者:行者123 更新时间:2023-12-04 01:40:51 25 4
gpt4 key购买 nike

短版:在启用 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直接使用。 FaultExceptions 提供 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
}

Webbehaviour 用于安装上述错误处理程序
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());

应用配置
<extensions>  
<behaviorExtensions>
<add name="errorHandler"
type="WcfServiceLibrary1.ErrorHandlerElement, WcfServiceLibrary1" />
</behaviorExtensions>
</extensions>

关于asp.net - 从启用 AJAX 的 WCF 服务返回错误详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com