こんにちは、私は Ierrorhandler を何時間も動作させようとしましたが、かなり行き詰っています :) このガイドから最大限の結果が得られました
http://www.remondo.net/wcf-global-exception-handling-attribute-and-ierrorhandler/#comment-10385
しかし、私はそれを自分の操作/機能で動作させることができません
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Phpwcfconsole
{
class program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Service1)))
{
try
{
host.Open();
Console.WriteLine("Host open. Press any key to <EXIT>");
Console.ReadLine();
host.Close();
}
catch (Exception e)
{
Console.WriteLine(Environment.NewLine + e.Message);
host.Close();
}
}
}
}
}
app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<system.serviceModel>
<services>
<service behaviorConfiguration="Phpwcfconsole.Service1Behavior"
name="Phpwcfconsole.Service1">
<endpoint
address=""
binding="basicHttpBinding"
contract="Phpwcfconsole.IService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://agent007:8732/phpwcf/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Phpwcfconsole.Service1Behavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<bindings>
<basicHttpBinding>
<binding name="MyServiceBinding"
hostNameComparisonMode="StrongWildcard"
receiveTimeout="00:10:00"
sendTimeout="00:10:00"
openTimeout="00:10:00"
closeTimeout="00:10:00"
maxReceivedMessageSize="20000000"
maxBufferSize="20000000"
maxBufferPoolSize="20000000"
transferMode="Buffered"
messageEncoding="Text"
textEncoding="utf-8"
bypassProxyOnLocal="false"
useDefaultWebProxy="true" >
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>
IService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace Phpwcfconsole
{
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value);
}
}
Serverfunctions.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Phpwcfconsole
{
public partial class Service1 : IService
{
public string GetData(int value)
{
throw new Exception("error");
}
}
}
ExceptionHandler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.Collections.ObjectModel;
using System.ServiceModel.Configuration;
namespace Phpwcfconsole
{
public class GlobalExceptionHandler : IErrorHandler
{
public bool HandleError(Exception ex)
{
return true;
}
public void ProvideFault(Exception ex, MessageVersion version,
ref Message msg)
{
// Do some logging here
var newEx = new FaultException(
string.Format("CALLED FROM YOUR GLOBAL EXCEPTION HANDLER BY {0}",
ex.TargetSite.Name));
MessageFault msgFault = newEx.CreateMessageFault();
msg = Message.CreateMessage(version, msgFault, newEx.Action);
}
}
public class GlobalExceptionHandlerBehaviourAttribute : Attribute, IServiceBehavior
{
private readonly Type _errorHandlerType;
public GlobalExceptionHandlerBehaviourAttribute(Type errorHandlerType)
{
_errorHandlerType = errorHandlerType;
}
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
var handler = (IErrorHandler)Activator.CreateInstance(_errorHandlerType);
foreach (ChannelDispatcherBase dispatcherBase in serviceHostBase.ChannelDispatchers)
{
var channelDispatcher = dispatcherBase as ChannelDispatcher;
if (channelDispatcher != null)
channelDispatcher.ErrorHandlers.Add(handler);
}
}
}
}
わかりましたので、console.writeLineを中に入れたら
public class GlobalExceptionHandlerBehaviourAttribute : 属性、IServiceBehavior 関数 プログラムを起動すると実行されることがわかります。しかし、関数を使用して例外をスローし、それを IErrorhandler でキャッチするガイドの例を取得できません。
他の関数内でいくつかの例外を試しましたが、IErrorhandler で何も起こりません。
しかし、Wcftestclientにサービスを追加し、IService.csでデバッグを停止して[OperationContract]を削除してから、もう一度開始して更新せずに関数を実行しようとすると、これまでに発見した例外が 1 つ発生します。 IErrorhandler によってキャッチされる
ここで私の問題は、関数内で例外をキャッチできないのはなぜですか? 回答ありがとうございます。c(: