ServiceBehavior для WCF REST
У меня проблема с настройкой ServiceBehavior для моей службы WCF.
Некоторый фон. В основном я разрабатываю WCF-сервис REST, который должен работать на IIS. Мне нужно иметь возможность регистрировать исключения, генерируемые службой (я использую log4net) и возвращать коды состояния HTTP в зависимости от типа исключения. Я хочу, чтобы моя реализация службы имела минимум знаний о материалах, связанных с WCF, поэтому я не хочу преобразовывать исключения в FaultException везде в службе. Таким образом, я понял, что добавление моего собственного IErrorHandler к хосту службы будет лучшим способом сделать это.
Моя проблема, однако, в том, что независимо от того, что я пытаюсь сделать, я не могу получить конфигурацию для своего пользовательского ServiceBehavior прямо в Web.config. Вот соответствующий код.
Веб-конфиг.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</modules>
</system.webServer>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="UsingErrorLogBehavior">
<errorLogBehavior/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior>
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="errorLogBehavior"
type="MyNameSpace.Web.ErrorExtensionElement, MyNameSpace.Web"/>
</behaviorExtensions>
</extensions>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true"
automaticFormatSelectionEnabled="false"
defaultOutgoingResponseFormat="Json"
maxReceivedMessageSize="4194304" transferMode="Buffered" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
ErrorExtensionElement.
namespace MyNameSpace.Web
{
public class ErrorExtensionElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(ErrorServiceBehavior); }
}
protected override object CreateBehavior()
{
return new ErrorServiceBehavior();
}
}
}
ErrorServiceBehavior.
namespace MyNameSpace.Web
{
public class ErrorServiceBehavior : IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
{
channelDispatcher.ErrorHandlers.Add(new ExceptionModule());
}
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
}
}
Где ExceptionModule реализует IErrorHandler.
1 ответ
У тебя есть <serviceBehavior>
раздел с именем "UsingErrorLogBehavior", но никакие конфигурации служб не ссылаются на этот раздел. Вы можете сделать этот раздел поведением службы по умолчанию (не задавая ему имя, как у поведения конечной точки), или добавить <service>
элемент для вашего сервиса, который ссылается на это поведение:
<services>
<service name="YourNamespace.YourServiceName"
behaviorConfiguration="UsingErrorLogBehavior">
<endpoint address=""
binding="webHttpBinding"
contract="YourNamespace.YourContractName" />
</service>
</services>