.net 如何防止通道异常导致WCF服务停止工作?
我使用netNamedPipeBinding创建了一个WCF单例服务。当发生通道异常时,它会使通道处于故障状态,所有后续操作都会抛出异常。我怎样才能防止这种情况?我希望TimeoutException或任何其他常见异常仅使一个操作失败,而不是使服务无响应。您需要将服务器端的异常包装为FaultException。如果控制线路的两端,并且两端都是.NET,则只需将.NET异常包装成.net 如何防止通道异常导致WCF服务停止工作?,.net,wcf,exception,timeout,channel,.net,Wcf,Exception,Timeout,Channel,我使用netNamedPipeBinding创建了一个WCF单例服务。当发生通道异常时,它会使通道处于故障状态,所有后续操作都会抛出异常。我怎样才能防止这种情况?我希望TimeoutException或任何其他常见异常仅使一个操作失败,而不是使服务无响应。您需要将服务器端的异常包装为FaultException。如果控制线路的两端,并且两端都是.NET,则只需将.NET异常包装成FaultException并发送回客户端即可。这样通道就可以保持可用 有关更多信息,请参见MSDN,并查看这篇和这篇
FaultException
并发送回客户端即可。这样通道就可以保持可用
有关更多信息,请参见MSDN,并查看这篇和这篇关于同一主题的博客文章
此外,为了让您的生活更轻松,请查看您可以在服务器端实现的,以全局捕获异常并将其转换为故障。也可以看到很多关于这个主题的博客文章,比如说,或者其他的(Bing或者Google更多)
为了使您的生活变得更加轻松,您可以将IErrorHandler作为一种行为来实现,您可以在服务配置中或通过在服务类上设置属性来打开或关闭服务。互联网上有很多实现,我喜欢的一个是:。您需要将服务器端的异常包装成FaultException。如果控制线路的两端,并且两端都是.NET,则只需将.NET异常包装成
FaultException
并发送回客户端即可。这样通道就可以保持可用
有关更多信息,请参见MSDN,并查看这篇和这篇关于同一主题的博客文章
此外,为了让您的生活更轻松,请查看您可以在服务器端实现的,以全局捕获异常并将其转换为故障。也可以看到很多关于这个主题的博客文章,比如说,或者其他的(Bing或者Google更多)
为了使您的生活变得更加轻松,您可以将IErrorHandler作为一种行为来实现,您可以在服务配置中或通过在服务类上设置属性来打开或关闭服务。互联网上有很多实现,我喜欢的一个是:。还有另一种方法。您可以为每个请求实例化客户端代理,而不是为多个请求使用单个实例。这样,如果通道进入故障状态,它将被丢弃 这是一个有点棘手的问题,因为你不应该处理一个频道,除了它是可识别的 它不起作用:
using(var channel = channelFactory.CreateChannel())
{
return channel.ServiceMethod(parameter);
}
相反,你应该:
public static class Service<T>
{
public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");
public static TResult Use<TResult>(Func<T, TResult> func)
{
TResult output;
var channel = (IClientChannel)_channelFactory.CreateChannel();
bool success = false;
try
{
output = func((T)proxy);
channel.Close();
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
return output;
}
}
return Service<IService>.Use(channel =>
{
return channel.ServiceMethod(parameter);
});
公共静态类服务
{
公共静态ChannelFactory\u ChannelFactory=新ChannelFactory(“”);
公共静态TResult使用(Func Func)
{
结果输出;
var channel=(IClientChannel)u channelFactory.CreateChannel();
布尔成功=假;
尝试
{
输出=func((T)代理);
channel.Close();
成功=真实;
}
最后
{
如果(!成功)
{
proxy.Abort();
}
}
返回输出;
}
}
返回服务。使用(频道=>
{
返回通道.ServiceMethod(参数);
});
还有另一种方法。您可以为每个请求实例化客户端代理,而不是为多个请求使用单个实例。这样,如果通道进入故障状态,它将被丢弃
这是一个有点棘手的问题,因为你不应该处理一个频道,除了它是可识别的
它不起作用:
using(var channel = channelFactory.CreateChannel())
{
return channel.ServiceMethod(parameter);
}
相反,你应该:
public static class Service<T>
{
public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>("");
public static TResult Use<TResult>(Func<T, TResult> func)
{
TResult output;
var channel = (IClientChannel)_channelFactory.CreateChannel();
bool success = false;
try
{
output = func((T)proxy);
channel.Close();
success = true;
}
finally
{
if (!success)
{
proxy.Abort();
}
}
return output;
}
}
return Service<IService>.Use(channel =>
{
return channel.ServiceMethod(parameter);
});
公共静态类服务
{
公共静态ChannelFactory\u ChannelFactory=新ChannelFactory(“”);
公共静态TResult使用(Func Func)
{
结果输出;
var channel=(IClientChannel)u channelFactory.CreateChannel();
布尔成功=假;
尝试
{
输出=func((T)代理);
channel.Close();
成功=真实;
}
最后
{
如果(!成功)
{
proxy.Abort();
}
}
返回输出;
}
}
返回服务。使用(频道=>
{
返回通道.ServiceMethod(参数);
});
您确定是服务频道在出现错误时没有响应吗?我一直在一个非常大的站点上使用单例服务,我从来没有遇到过您描述的问题。我得到的日志表明,该通道不可用,因为它处于故障状态。您确定是该服务通道在出现错误时没有响应吗?我一直在一个非常大的站点上使用单例服务,我从来没有遇到过您描述的问题。我得到的日志表明,该频道不可用,因为它处于故障状态。我还找到了另一个解决方案,请参阅我的回答有趣的是,当我实施我的解决方案时,我的服务停止工作,我发现我的解决方案存在问题,我们不应该处理频道,因为它们很棘手,请参阅,我还找到了另一个解决方案,请参阅我的回答有趣的是,当我实施我的解决方案时,我的服务停止工作,因此,我必须实现您的解决方案以使它们恢复正常。我发现我的解决方案存在问题,我们不应该处理通道,因为它们很棘手,请看,我猜这里有一个错误:channel
和proxy
是一样的。我想你应该用channel
替换proxy
。我想这里有个错误:channel
和proxy
是一样的。我认为你应该用频道
取代代理
。