WCFサービスがあり、IErrorHandlerがバインドされたFaultContractがあり、正常に機能していました。どういうわけか、私にはわかりませんが、実行時にバインドされなくなりました。とにブレークポイントを設定するApplyDispatchBehavior
とValidate
、デバッグの開始時にブレークポイントが呼び出されないため(停止するために使用されます)、エラーが発生したときに例外が処理されません。
最初はこのブログ投稿に従って実装しましたが、正常に機能しましたが、2つ目のインターフェイス/エンドポイントを追加すると、機能しなくなりました。私はこのSO投稿に従ってすべてのコードを変更しましたが、役に立ちませんでした。もう1つ発生し始めたのは、Microsoft Service Configuration Editorでweb.configを開くと、次のエラーが発生することです。
The 'TestAppServer, Version 1.0.0.0, Culture=neutral, PublicKeyToken=null' assembly could not be found. Do you want to locate it? If you select 'No', you will not be prompted for the same assembly again. To avoid seeing this message every time the system cannot fund the assembly, please copy the assembly file to the same folder as the configuration file.
上記のエラーは、2番目のエンドポイント/インターフェイスを追加した後、WCFサービスでエラー処理を失ったときに発生し始めました。以下は私のWeb設定です。
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="ServiceErrorHandler" type="company.Test.appserver.implementation.ServiceErrorHandlerBehaviorExtensionElement, TestAppServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<bindings>
<basicHttpBinding>
<binding name="SimpleBinding" />
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="DefaultBehavior" name="company.Test.appserver.implementation.TestUpdate">
<endpoint address="udt" binding="basicHttpBinding" bindingConfiguration="SimpleBinding"
name="TestUpdate" bindingNamespace="http://company/Test/update/2011/04"
contract="company.Test.appserver.interfaces.ITestUpdate" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
name="TestUpdateMex" bindingNamespace="http://company/Test/update/2011/04"
contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="DefaultBehavior" name="company.Test.appserver.implementation.TestTransaction">
<endpoint address="udt" binding="basicHttpBinding" bindingConfiguration="SimpleBinding"
name="TestTransacao" bindingNamespace="http://company/Test/transaction/2011/04"
contract="company.Test.appserver.interfaces.ITestTransacao" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
name="TestTransacaoMex" bindingNamespace="http://company/Test/transaction/2011/04"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
httpGetBindingConfiguration="" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
httpGetBindingConfiguration="" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
以下は私のエラーハンドラのコードです:
namespace company.Test.appserver.implementation
{
public class ServiceErrorHandlerBehaviorExtensionElement : BehaviorExtensionElement, IServiceBehavior
{
public override Type BehaviorType
{
get { return typeof(TestErrorHandler); }
}
protected override object CreateBehavior()
{
return new TestErrorHandler();
}
private IErrorHandler GetInstance()
{
return new TestErrorHandler();
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
IErrorHandler errorHandlerInstance = GetInstance();
foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher cd = cdb as ChannelDispatcher;
if (cd != null)
{
cd.ErrorHandlers.Add(errorHandlerInstance);
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (var svcEndpoint in serviceDescription.Endpoints)
{
if (svcEndpoint.Contract.Name != "IMetadataExchange")
{
foreach (var opDesc in svcEndpoint.Contract.Operations)
{
if (opDesc.Faults.Count == 0)
{
string msg = string.Format("");
}
}
}
}
}
}
public class TestErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (!(error is FaultException))
{
ClsTestFaultContract exContract = new ClsTestFaultContract();
FaultException<ClsTestFaultContract> fex =
new FaultException<ClsTestFaultContract>(exContract, exContract.DescricaoErro,
new FaultCode(Convert.ToString(exContract.CodigoErro)));
MessageFault msgFault = fex.CreateMessageFault();
fault = Message.CreateMessage(version, msgFault, ErrorHandlerConstant.FaultAction);
}
}
}
}
以下は私のインターフェースの1つです。
namespace company.Test.appserver.interfaces
{
[ServiceContract(Namespace = "http://company/Test/transaction/2011/04",
Name = "ITestTransacao", SessionMode = SessionMode.Allowed)]
public interface ITestTransacao
{
[OperationContract]
[FaultContract(typeof(ClsTestFaultContract), Action = ErrorHandlerConstant.FaultAction)]
Int32 RegistrarTransacao(String Param1, String Param2, String Param3, Int32 Param4);
[OperationContract]
[FaultContract(typeof(ClsTestFaultContract), Action = ErrorHandlerConstant.FaultAction)]
void ConfirmarTransacao(String Param1, String Param2, Int32 Param3, String Param4, String Param5);
[OperationContract]
[FaultContract(typeof(ClsTestFaultContract), Action = ErrorHandlerConstant.FaultAction)]
void CancelarTransacao(String Param1, String Param2, String Param3, Int32 Param4, String Param5 = "");
}
}
私は数え切れないほどの時間を無駄にしました、そして私は私のエラー処理を壊した何が起こったのか理解できないようです、それはうまくいきました。Tks SO MUCH for any help
編集
私が得た助けの後に、私は作業コードの下に投稿しています。もう一度Tks...正しいエラーハンドラは次のとおりです。
namespace company.Test.appserver.implementation
{
public class ServiceErrorHandlerBehaviorExtensionElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(TestErrorHandler); }
}
protected override object CreateBehavior()
{
return new TestErrorHandler();
}
}
public class TestErrorHandler : ServiceErrorHandlerBehaviorExtensionElement, IErrorHandler, IServiceBehavior
{
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (!(error is FaultException))
{
ClsTestFaultContract exContract = new ClsTestFaultContract();
FaultException<ClsTestFaultContract> fex =
new FaultException<ClsTestFaultContract>(exContract, exContract.DescricaoErro,
new FaultCode(Convert.ToString(exContract.CodigoErro)));
MessageFault msgFault = fex.CreateMessageFault();
fault = Message.CreateMessage(version, msgFault, ErrorHandlerConstant.FaultAction);
}
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher cd = cdb as ChannelDispatcher;
if (cd != null)
{
cd.ErrorHandlers.Add(this);
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (var svcEndpoint in serviceDescription.Endpoints)
{
if (svcEndpoint.Contract.Name != "IMetadataExchange")
{
foreach (var opDesc in svcEndpoint.Contract.Operations)
{
if (opDesc.Faults.Count == 0)
{
string msg = string.Format("");
}
}
}
}
}
}
}
そして以下は正しいweb.configです
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="ServiceErrorHandler" type="company.Test.appserver.implementation.ServiceErrorHandlerBehaviorExtensionElement, TestAppServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<bindings>
<basicHttpBinding>
<binding name="SimpleBinding" />
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="DefaultBehavior" name="company.Test.appserver.implementation.TestUpdate">
<endpoint address="udt" binding="basicHttpBinding" bindingConfiguration="SimpleBinding"
name="TestUpdate" bindingNamespace="http://company/Test/update/2011/04"
contract="company.Test.appserver.interfaces.ITestUpdate" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
name="TestUpdateMex" bindingNamespace="http://company/Test/update/2011/04"
contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="DefaultBehavior" name="company.Test.appserver.implementation.TestTransaction">
<endpoint address="udt" binding="basicHttpBinding" bindingConfiguration="SimpleBinding"
name="TestTransacao" bindingNamespace="http://company/Test/transaction/2011/04"
contract="company.Test.appserver.interfaces.ITestTransacao" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
name="TestTransacaoMex" bindingNamespace="http://company/Test/transaction/2011/04"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
httpGetBindingConfiguration="" />
<serviceDebug includeExceptionDetailInFaults="true" />
<ServiceErrorHandler />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpGetBinding="webHttpBinding"
httpGetBindingConfiguration="" />
<serviceDebug includeExceptionDetailInFaults="false" />
<ServiceErrorHandler />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>