gpt4 book ai didi

wcf - 如何在未处理的错误时停止自托管 WCF 服务?

转载 作者:行者123 更新时间:2023-12-03 08:01:56 26 4
gpt4 key购买 nike

我有一个作为 Windows 服务运行的自托管 WCF 服务。对于测试,我将其作为控制台应用程序运行。

我想捕获服务中发生的所有未处理的异常并关闭主机。我想捕获在产生响应时发生的所有非 FaultExceptions,以及在“空闲模式”下抛出的所有异常 - 即从某些工作线程抛出的异常。

不幸的是,我无法通过 IErrorHandler (未调用)或 AppDomain.CurrentDomain.UnhandledException (未引发)处理异常。

有什么线索吗?

应用程序配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="TestServiceBahavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="TestServiceBahavior" name="WcfErrorHandling.TestService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001/TestService" />
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration="" contract="WcfErrorHandling.ITestService" />
<endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>

编码:
using System;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;

namespace WcfErrorHandling
{
[ServiceContract]
interface ITestService
{
[OperationContract]
string SayHello(string param);
}

public class TestService : ITestService
{
public string SayHello(string param)
{
if (param == "ae")
throw new ArgumentException("argument exception");
if (param == "fe")
throw new FaultException("fault exception");
return "hello";
}
}

public class TestHost : ServiceHost, IErrorHandler
{
public TestHost()
: base(typeof(TestService))
{
}

public void Start()
{
AppDomain.CurrentDomain.UnhandledException +=
(sender, ea) => UnhandledExceptionHandler(ea.ExceptionObject as Exception);

Open();
foreach (var channelDispatcher in ChannelDispatchers.OfType<ChannelDispatcher>())
channelDispatcher.ErrorHandlers.Add(this);
}

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
// do nothing
}

public bool HandleError(Exception error)
{
if (!(error is FaultException))
UnhandledExceptionHandler(error);
return true;
}

private void UnhandledExceptionHandler(Exception ex)
{
Close();
Environment.Exit(1);
}
}

public class Program
{
public static void Main(string[] args)
{
var testHost = new TestHost();
testHost.Start();
Console.Out.WriteLine("Press any key to exit...");
Console.ReadKey();
testHost.Close();
}
}
}

最佳答案

有同样的问题,这为我解决了:

让你的服务实现这个接口(interface):

public class MyService : System.ServiceModel.Description.IServiceBehavior

像这样实现它:
    public void AddBindingParameters(System.ServiceModel.Description.ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<System.ServiceModel.Description.ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
return;
}

public void ApplyDispatchBehavior(System.ServiceModel.Description.ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher channel in serviceHostBase.ChannelDispatchers) { channel.ErrorHandlers.Add(new ErrorHandler()); }
}

public void Validate(System.ServiceModel.Description.ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
return;
}

并添加这个类:
public class ErrorHandler : IErrorHandler
{
bool IErrorHandler.HandleError(Exception error)
{ return true; }
void IErrorHandler.ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)
{ return; }
}

现在在 HandleError 上设置一个断点。它会显示异常

关于wcf - 如何在未处理的错误时停止自托管 WCF 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6136457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com