当我从项目解决方案中引用它时,我有一个运行完美的 Web 服务。一旦我将它上传到远程服务器,它就开始爆炸。不幸的是,我得到的唯一错误消息是在客户端“用户代码未处理故障异常”。在 Web 服务内部,我在所有方法中都处理了异常,所以我很确定它在某个地方被捕获,但我不知道如何看到它。我怀疑问题与权限有关,但我看不到它发生在哪里。
我尝试将错误消息放入对象返回中,但仍然没有成功;像这样的东西:
public bool SetDirectReports(ADUser user)
{
try
{
var adEntry = new DirectoryEntry(string.Format("LDAP://<GUID={0}>", user.Guid), "administrator", "S3cur1ty");
if (adEntry.Properties["directReports"].Count > 0)
{
user.DirectReports = new List<ADUser>();
foreach (string directReport in adEntry.Properties["directReports"]) //is being returned as full distinguished name
{
var dr = new DirectoryEntry(string.Format("LDAP://{0}", directReport), "administrator", "S3cur1ty");
user.DirectReports.Add(GetUserByGuid(dr.NativeGuid));
}
return true;
}
else
{
user.DirectReports = new List<ADUser>();
return false;
}
}
catch (Exception ex)
{
user.HasError = true;
user.ErrorMessage = "Error setting direct reports: " + ex.Message;
return false;
}
}
但它仍然没有捕获。我希望有更好的方法。我不确定是否可以添加一些将异常输出到控制台的内容或什么。任何帮助,将不胜感激。 TIA
附言这不一定是崩溃的方法,服务中有一个它们的网络。
最佳答案
您应该将所有异常转储到服务器端的日志文件中;将错误信息暴露给客户端是一个潜在的安全风险,这就是它默认关闭的原因。
如果你真的想向客户端发送异常信息,你可以打开它。如果您正在使用 WCF 服务,您应该为服务行为设置“includeExceptionDetailsInFaults”属性,如 dealing with unhandled exceptions in WCF 上的这篇 MSDN 文章中所述。 .完成后,您将在 FaultException
上拥有房产。调用Detail
它本身应该是 Exception
的类型.
为了更好地处理错误,您还应该使用 FaultContract
查看类型错误。和 FaultException<>
类(class);这些的好处是它们不会使 channel 进入故障状态并且可以正确处理:
try
{
// do stuff here
}
catch (Exception ex)
{
var detail = new CustomFaultDetail
{
Message = "Error setting direct reports: " + ex.Message
};
throw new FaultException<CustomFaultDetail>(detail);
}
如果您使用的是 ASP.NET Web 服务,您应该设置
customErrors
在 web.config 中将模式设置为“关闭”。这会将整个异常详细信息作为 HTML 发送回,客户端应将其作为其接收的 SOAP 异常的一部分接收。
关于wcf - 如何从 Web 服务中获取异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604974/