3

こんにちは、私は 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(:

4

1 に答える 1

0

FaultContractAttribute は、あなたがしようとしていることに対して十分でしょうか? msdn doc の例を見てください。 http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute.aspx カスタム サービスの動作よりも複雑ではなく、あなたがしようとしていることと似ています。

コンシューマは必ずしも .net クライアントではないため、FaultContracts は、プロセス/マシン間で WCF を使用する場合の例外に相当します。

于 2013-09-27T05:12:53.627 に答える