无法使用正确的web.config将IErrorHandler整合到我的项目中
我有一个成功工作的WCF正在被.net 4中的web客户端使用,但是当尝试将IErrorhandler作为全局错误记录器设置为捕获所有我的所有服务方法时,事情都快速失败 – 主要是与web.config部分!请帮忙.
这三个服务是:IReport,IServiceCustomer,IServiceUser
在一个名为MyErrorClass.cs的单独类中实现了IErrorHandler,如下所示:
namespace CustomerWcfService { public class WcfErrorHandler : IErrorHandler { /// <summary> /// Enables the creation of a custom <see cref="T:System.ServiceModel.FaultException`1"/> that is returned from an exception in the course of a service method. /// </summary> /// <param name="error">The <see cref="T:System.Exception"/> object thrown in the course of the service operation.</param><param name="version">The SOAP version of the message.</param><param name="fault">The <see cref="T:System.ServiceModel.Channels.Message"/> object that is returned to the client,or service,in the duplex case.</param> public void ProvideFault(Exception error,MessageVersion version,ref Message fault) { // can create custom error messages here } /// <summary> /// Enables error-related processing and returns a value that indicates whether the dispatcher aborts the session and the instance context in certain cases. /// </summary> /// <returns> /// true if should not abort the session (if there is one) and instance context if the instance context is not <see cref="F:System.ServiceModel.InstanceContextMode.Single"/>; otherwise,false. The default is false. /// </returns> /// <param name="error">The exception thrown during processing.</param> public bool HandleError(Exception error) { // log error to database using legacy error handler ErrorHandler.LogError(error); // Let the other ErrorHandler do their jobs return true; } } public class WcfErrorServiceBehavIoUr : IServiceBehavior { /// <summary> /// Provides the ability to inspect the service host and the service description to confirm that the service can run successfully. /// </summary> /// <param name="serviceDescription">The service description.</param><param name="serviceHostBase">The service host that is currently being constructed.</param> public void Validate(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase) { } /// <summary> /// Provides the ability to pass custom data to binding elements to support the contract implementation. /// </summary> /// <param name="serviceDescription">The service description of the service.</param><param name="serviceHostBase">The host of the service.</param><param name="endpoints">The service endpoints.</param><param name="bindingParameters">Custom objects to which binding elements have access.</param> public void AddBindingParameters(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase,Collection<ServiceEndpoint> endpoints,BindingParameterCollection bindingParameters) { } /// <summary> /// Provides the ability to change run-time property values or insert custom extension objects such as error handlers,message or parameter interceptors,security extensions,and other custom extension objects. /// </summary> /// <param name="serviceDescription">The service description.</param><param name="serviceHostBase">The host that is currently being built.</param> public void ApplyDispatchBehavior(ServiceDescription serviceDescription,ServiceHostBase serviceHostBase) { var handler = new WcfErrorHandler(); foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(handler); } } } public class WcfErrorHandlerBehavIoUr : BehaviorExtensionElement { /// <summary> /// Creates a behavior extension based on the current configuration settings. /// </summary> /// <returns> /// The behavior extension. /// </returns> protected override object CreateBehavior() { return new WcfErrorServiceBehavIoUr(); } /// <summary> /// Gets the type of behavior. /// </summary> /// <returns> /// A <see cref="T:System.Type"/>. /// </returns> public override Type BehaviorType { get { return typeof (WcfErrorServiceBehavIoUr); } } } }
web.config应该是什么样的,因为我已经尝试了来自各种教程和网络上的答案的百万组合,但不能使其工作!这是当我不涉及IErrorHandler时,web.config的原始工作提取是如何看的
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <!-- To avoid disclosing @R_403_338@data information,set the value below to false and remove the @R_403_338@data endpoint above before deployment --> <service@R_403_338@data httpGetEnabled="true" /> <!-- To receive exception details in faults for debugging purposes,set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer>
请允许有人发送这个WCF noob修正的web.config请求,因为我一直在删除,再次尝试,得到没有在哪里(我已经失去了这么多天):(
解决方法
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <!-- To avoid disclosing @R_403_338@data information,set the value below to false and remove the @R_403_338@data endpoint above before deployment --> <service@R_403_338@data httpGetEnabled="true" /> <!-- To receive exception details in faults for debugging purposes,set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="true" /> <errorHandler/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> <extensions> <behaviorExtensions> <add name="errorHandler" type="CustomerWcfService.WcfErrorHandlerBehavIoUr,CustomerWcfService,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"/> </behaviorExtensions> </extensions> </system.serviceModel>
然后将您的行为应用于您想要应用的服务.
编辑:
遗憾的是,但您实际上需要删除任何换行符和扩展名定义中的类型名称中的任何额外的空格(旧的WCF错误,强制您在扩展类型声明中使用完全限定名称字符串).