我已经阅读了所有关于这一点的内容,但也许我错过了一些东西(好吧,我肯定错过了一些东西,否则它会有效)
我在服务器业务层中抛出了一些异常错误:
public class RfcException : Exception
{
public RfcException(string _m, Exception _inner) : base(_m, _inner)
{ }
public Dictionary<string, string> ExtendedProperties
{
get { return extendedProperties; }
protected set { extendedProperties = value; }
}
private Dictionary<string, string> extendedProperties = new Dictionary<string, string>();
}
Run Code Online (Sandbox Code Playgroud)
我在服务中留下未经处理的,但我有一个IErrorHandler要抓住并创建一个FaultMessage:
public class FaultErrorHandler : BehaviorExtensionElement, IErrorHandler, IServiceBehavior
{
public bool HandleError(Exception error)
{
if (!Logger.IsLoggingEnabled()) return true;
var logEntry = new LogEntry
{
EventId = 100,
Severity = TraceEventType.Error,
Priority …Run Code Online (Sandbox Code Playgroud) 以每个服务上有10个服务和20个方法的项目为例.
所有服务都从具有安全检查的基本服务继承.每种方法的第一件事就是调用安全检查.如果出现问题,则会引发安全性异常.
问题是:我是否需要在每个方法(OperationContract)上指定FaultContract,还是可以在中央定义中执行一次?
我成功地与第三方肥皂服务合作.我已经为自动生成类的soap Web服务添加了服务引用.
发生错误时,它返回一个soap响应,如下所示:
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring xsi:type="xsd:string">Error while reading parameters of method 'Demo'</faultstring>
<detail xsi:type="xsd:string">Invalid login or password. Connection denied.</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)
我可以捕获错误但不提取细节.我试过以下代码:
catch (FaultException ex)
{
MessageFault msgFault = ex.CreateMessageFault();
var elm = msgFault.GetDetail<string>();
//throw Detail
}
Run Code Online (Sandbox Code Playgroud)
但是,作为详细信息节点的以下错误不是对象:
Expecting element 'string' from namespace 'http://schemas.datacontract.org/2004/07/MyDemoNamespace'.. Encountered 'Text' with name '', namespace ''.
Run Code Online (Sandbox Code Playgroud)
这是第三方API,因此我无法更改响应.
我目前正在使用WCF后端处理WPF应用程序.我们已经实现了客户端日志记录解决方案和用于异常处理的服务器日志记录解决方案,并且它们运行良好,但通常很难通过网络将信息绑定在一起.如果在服务器上发生异常,我想要一种方法将异常令牌传回到线路,以便我可以在客户端上将其记录,但异常.这样,当我在解决客户端错误时遇到问题时,我可以很容易地将其与服务器异常相关联.
我想提供一些关于我们架构的更多信息,然后我会陈述我的问题.
我们的WCF实现比设置服务引用的开箱即用方法更强大.我们在客户端上实现了动态代理生成.我们通过创建客户端和服务器共享的Web服务接口来完成此任务,并使用Castle.DynamicProxy.ProxyGenerator类和CreateInterfaceProxyWithoutTarget方法来创建代理.另外,当我们调用CreateInterfaceProxyWithoutTarget方法时,我们指定一个IInterceptor实现.在服务器上有三个主要类,用于跟踪和故障行为:
FaultOperationInvoker(Implements IOperationInvoker):尝试使用IOperationInvoker.Invoke调用服务方法.如果是故障异常类型,则重新抛出,如果是异常,则尝试确定是否存在具有特定详细信息类型的故障合同,如果是,则进行换行,然后使用详细信息引发新的故障异常.
internal class FaultOperationInvoker : IOperationInvoker
{
IOperationInvoker innerOperationInvoker;
FaultDescription[] faults;
public FaultOperationInvoker(IOperationInvoker invoker, FaultDescription[] faults)
{
this.innerOperationInvoker = invoker;
this.faults = faults;
}
#region IOperationInvoker Members
object[] IOperationInvoker.AllocateInputs()
{
return this.innerOperationInvoker.AllocateInputs();
}
object IOperationInvoker.Invoke(object instance, object[] inputs, out object[] outputs)
{
try
{
return this.innerOperationInvoker.Invoke(instance, inputs, out outputs);
}
catch (FaultException e)
{
ServerLogger.GetLogger(instance.GetType().FullName).LogException(e, "Unhandled exception in service operation.");
//allow fault exceptions to bubble out
throw;
}
catch (Exception e)
{
Type exceptionType = e.GetType(); …Run Code Online (Sandbox Code Playgroud) 我已经[FaultContract(typeof(ExceptionDetail))]为我的操作合同设置了属性.当我尝试将服务添加到客户端应用程序时,我收到此错误 - "Custom tool error: Failed to generate code for the service reference 'ServiceReference1'. Please check other error and warning messages for details."
但是当我注释掉FaultContract属性时,我能够在我的客户端应用程序中添加wcf服务引用.
我正在使用Silverlight客户端和.NET 3.5 WCF服务的WCF双工服务.
我的方案是:在双工推送OneWay操作从服务器到客户端如果在客户端通知处理程序中发生异常,则通道会出现静默故障,因此任何进一步的双工调用都会从服务器超时并失败.(如此处所解释的单向操作和例外)
我的问题:
FaultContracta 装饰,OneWay OperationContract在客户端包装异常并防止通道故障吗?我刚注意到一些特别的东西 我有一个通过basicHttpBinding发布的内部库存服务,以及一个启用了元数据的customBinding(http + binary).我还为http包含了一个mex端点.我们使用Visual Studio 2008和VB.NET
就在最近,我们注意到我们无法在其他项目中成功地为此服务添加服务引用.它将生成的所有内容是我们通过FaultContract包含的第一个自定义异常(实际上,只有一种类型).如果我添加一个简单的Web引用,它也可以正常工作.此外,WcfClient.exe在加载服务时也没有问题.只是VS.NET添加服务引用不起作用.
在服务中,此异常继承自Exception并标记为可序列化.这就是你应该做的所有,不是吗?
无论如何,这让我感到困惑.如果我为此自定义异常删除FaultContract一切正常.我可以添加服务引用,没问题.但有没有办法可以让我的自定义异常?这是一个已知的问题吗?