总的来说,我对 WCF 很陌生。我从在 ASP.NET Web 应用程序中使用相当简单的 .SVC 服务获得了多少经验。
我第一次尝试尝试使用 WCF 项目,但遇到了一个主要的障碍。
我相信大多数人都知道,出于某种奇怪的原因,在 customErrors 模式设置为 On 的 Web 应用程序中
<customErrors mode = “On” />
服务(.ASMX 和 .SVC)不会向客户端返回异常详细信息。相反,异常和堆栈跟踪被清空,并且消息总是显示“处理请求时出错”,这根本没有帮助。
当服务直接托管在 Web 应用程序本身内部时,可以通过将服务放在专用文件夹中并将该文件夹的 customErrors 设置为“关闭”来轻松解决此限制。
但是,我遇到了同样的问题,异常没有从单独的 WCF 项目中的服务返回。问题是,我不知道如何解决这个问题。
简而言之:我需要让我的 WCF 项目服务向客户端冒泡真正的异常——或者至少是原始异常消息,而不是“处理请求时出错”。
编辑 :我可能应该在这里指出,我想返回异常的原因是我经常通过 Ajax (jQuery) 从客户端调用这些服务,并且如果返回消息是“正常"返回(例如,使用绿色文本),然后在出现错误时使用红色文本。我在 $.ajax 对象的错误处理程序中处理消息格式,这显然只会在服务失败时运行。
我还应该指出,当 customErrors Off 时一切正常:
<customErrors mode = “Off” />
所以,我在想,也许可以设置一些配置属性来阻止 ASP.NET 运行时在使用 customErrors 时终止我的异常。
Here是我在这方面找到的一些相关信息。
最佳答案
您还有另一种选择来捕获要冒泡给客户端的异常,并返回服务错误。
由于您必须自己设计故障契约(Contract),因此还需要进行更多的设计工作,但它使您可以灵活地将任何您想要的东西返回给客户。所以你可以设计一个契约来详细说明错误,如果你认为必要的话,堆栈跟踪。
例子:
[DataContract(Namespace = "urn:// or http://....")]
public class ClientNeedsToKnowFault
{
[DataMember]
public List<Error> Errors
{
get { return _errors; }
set { _errors = value; }
}
....
public ClientNeedsToKnowFault() { }
public ClientNeedsToKnowFault(string message)
{
Message = message;
Errors = new List<Error>() { new Error(message) };
}
...
//Helper method to throw
public static void ThrowFault(string message, List<Error> errorList)
{
throw new FaultException<ClientNeedsToKnowFault>(new ClientNeedsToKnowFault(message, errorList));
}
一旦你设计了你的错误,你就可以向服务方法添加一个额外的属性。
[FaultContract(typeof(ClientNeedsToKnowFault))]
void MyServiceMethod();
最后一步是扔掉它。正如你在上面看到的,我只是放了一个辅助方法来抛出它,因为我认为 FaultException 过程有点困惑。
我会说这种方法的主要缺点是必须在客户端捕获错误。但如果信息重要到足以返回错误,您可能需要这种复杂性。
关于web-services - 从 WCF 项目返回有意义的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2546492/