Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何防止通道异常导致WCF服务停止工作?_.net_Wcf_Exception_Timeout_Channel - Fatal编程技术网

.net 如何防止通道异常导致WCF服务停止工作?

.net 如何防止通道异常导致WCF服务停止工作?,.net,wcf,exception,timeout,channel,.net,Wcf,Exception,Timeout,Channel,我使用netNamedPipeBinding创建了一个WCF单例服务。当发生通道异常时,它会使通道处于故障状态,所有后续操作都会抛出异常。我怎样才能防止这种情况?我希望TimeoutException或任何其他常见异常仅使一个操作失败,而不是使服务无响应。您需要将服务器端的异常包装为FaultException。如果控制线路的两端,并且两端都是.NET,则只需将.NET异常包装成FaultException并发送回客户端即可。这样通道就可以保持可用 有关更多信息,请参见MSDN,并查看这篇和这篇

我使用netNamedPipeBinding创建了一个WCF单例服务。当发生通道异常时,它会使通道处于故障状态,所有后续操作都会抛出异常。我怎样才能防止这种情况?我希望TimeoutException或任何其他常见异常仅使一个操作失败,而不是使服务无响应。

您需要将服务器端的异常包装为FaultException。如果控制线路的两端,并且两端都是.NET,则只需将.NET异常包装成
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
是一样的。我认为你应该用
频道
取代
代理