如何防止一个WCF服务从进入故障状态

 我来答
makerseo168
2016-12-09 · TA获得超过104个赞
知道答主
回答量:99
采纳率:25%
帮助的人:13万
展开全部
大多数,如果不是所有的异常可以看出,在WCF轨迹(配置轨迹)和微量最好使用服务轨迹查看器查看。 这不是你应该已经跑了一整天在生产,但它有助于排除故障反正。 此外,请注意,oneways可能不会作为一个真正运行的“射后不理”视SessionMode如果您有您的服务配置为SessionMode.Allowed甚至SessionMode.Required,该单向操作将运行 CodeGo.net,如果它不是单向的所有(这个可以观察oneways超过坦率地说,不过,我不知道这是否改变了异常,你可以得到的类型,或者当你让他们,但是,在任何情况下,你应该得到一个异常,如果该请求不能送的。AFAIK,该单向“结束”时,enqued在服务器端,所以有地方(WCF相关的)异常在那之前(序列化/反序列化记)。 那么,这样的相关异常见过最好的(甚至是IErrorHandler接口并没有让他们都因时,它被称为在请求/响应流量的事实)使用轨迹/ traceviewer。
2. 如何处理故障的官方是在这里: 处理异常和 故障 了解状态 变化 与主网页是在信道模型概述 有一个很好的状态示出的事情是如何发生的:
3. 异常情况将发生故障的代理。你不能AFAIK做很多有关:不异常;-P 我有点惊讶的是单向还是个问题,但对于吞咽属升,有学分: 是你扔的故障?或异常?它很重要(而且应该是“错误”) 作为一个hacker,你可以启用调试-但是请关闭此服务! 你在“使用”的服务对象?我刚刚在博客上这个确切的主题...基本上,你的“使用”可吞异常。 3个选项: 唐的“使用” 子类的代理和重写的Dispose() 把它包,按照该博客
4. 通常情况下,WCF服务承载在ServiceHost中,如果WCF的服务失败,那么唯一的选择就是killWCF服务,并开始一个新的。 在ServiceHost有一个事件触发器“断块”的时候,WCF服务失败时被激活:
ServiceHost host = new ServiceHost(new Service.MyService());
host.Faulted += new EventHandler(host_faulted);
host.Open();
这是可能得到异常的故障,但它需要多一点的工作:
public class ErrorHandler : IErrorHandler
{
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
public bool HandleError(Exception error)
{
Console.WriteLine("exception");
return false;
}
}
public class ErrorServiceBehavior : IServiceBehavior
{
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
ErrorHandler handler = new ErrorHandler();
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(handler);
}
}
}
ServiceHost host = new ServiceHost(new Service.MyService());
host.Faulted += new EventHandler(host_faulted);
host.Description.Behaviors.Add(new ErrorServiceBehavior());
host.Open();
积分
5. 大约2)... 诀窍在于,你“使用”,应始终在抛出异常的代理调用Abort()。文章WCF疑难杂症解释这一切。 服务类的文章,它包装服务调用者的启发。这是从我的项目的示例代码:
ServiceHelper<CodeListServiceClient, CodeListService.CodeListService>.Use(
proxy => seasonCodeBindingSource.DataSource = proxy.GetSeasonCodes(brandID);
);
这是ServiceHelper的代码,从文章略加修改。到目前为止,它已经真的很好。
using System;
using System.ServiceModel;
namespace Sportina.EnterpriseSystem.Client.Framework.Helpers
{
public delegate void UseServiceDelegate<TServiceProxy>(TServiceProxy proxy);
public static class ServiceHelper<TServiceClient, TServiceInterface> where TServiceClient : ClientBase<TServiceInterface>, new() where TServiceInterface : class
{
public static void Use(UseServiceDelegate<TServiceClient> codeBlock)
{
TServiceClient proxy = null;
bool success = false;
try
{
proxy = new TServiceClient();
codeBlock(proxy);
proxy.Close();
success = true;
}
catch (Exception ex)
{
Common.Logger.Log.Fatal("Service error: " + ex);
throw;
}
finally
{
if (!success && proxy != null)
proxy.Abort();
}
}
}
}

6. 我有一个问题,即通道仍然处于故障状态的异常之后。这将服务于任何后续连接被渲染。 从故障状态恢复服务的修复是处理通道发生故障的事件:
channelFactory = new ChannelFactory<IService>(endpoint);
channelFactory.Faulted += OnChannelFaulted;
var channel = channelFactory.CreateChannel();
然后定义OnChannelFaulted:
void OnChannelFaulted(object sender, EventArgs e)
{
channelFactory.Abort();
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式