Невозможно добавить пользовательский WebHttpBehavior: невозможно добавить два элемента с одинаковым ключом - PullRequest
2 голосов
/ 08 ноября 2011

Сначала немного предыстории: у меня есть служба REST в WCF 4, которая использует WebHttpEndpoint. Вместо того, чтобы иметь явный обработчик ошибок в каждом методе службы или даже в каждом классе службы, я хотел бы иметь централизованную обработку ошибок, которая ведет протоколирование и может обернуть красивое настраиваемое сообщение для передачи клиенту.

Я пытаюсь сделать это, внедрив IErrorHandler и добавив это к клиенту WebHttpBehavior:

public class ErrorHandlerBehavior : WebHttpBehavior
{
    protected override void AddServerErrorHandlers(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        base.AddServerErrorHandlers(endpoint, endpointDispatcher);
    }
}

Затем я добавляю это, используя ExtensionElement:

<behaviors>
    <endpointBehaviors>
        <behavior>
            <authenticationInspector />
            <authorizationInspector />    
            <errorHandler />   
            <webHttp
                defaultBodyStyle="Bare"
                defaultOutgoingResponseFormat="Json"
                helpEnabled="true"  />      

Если весь подход к обработке ошибок кажется плохой идеей, не стесняйтесь комментировать это ...

Однако мой вопрос: почему я получаю это исключение при попытке запуска службы:

[ArgumentException: Cannot add two items with the same key to SynchronizedKeyedCollection.]
   System.Collections.Generic.SynchronizedKeyedCollection`2.AddKey(K key, T item) +12277986
   System.Collections.Generic.SynchronizedKeyedCollection`2.InsertItem(Int32 index, T item) +38
   System.ServiceModel.Dispatcher.OperationCollection.InsertItem(Int32 index, DispatchOperation item) +53
   System.Collections.Generic.SynchronizedCollection`1.Add(T item) +78
   System.ServiceModel.Description.WebHttpBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) +2498
   System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +4275
   System.ServiceModel.ServiceHostBase.InitializeRuntime() +60
   System.ServiceModel.ServiceHostBase.OnBeginOpen() +27
   System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +50
   System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +318
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +206
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +651

[ServiceActivationException: The service '/api/Errors' cannot be activated due to an exception during compilation.  The exception message is: Cannot add two items with the same key to SynchronizedKeyedCollection..]
   System.Runtime.AsyncResult.End(IAsyncResult result) +688590
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +190

System.ServiceModel.Activation.AspNetRouteServiceHttpHandler.EndProcessRequest(IAsyncResult result) +6
System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +96

Похоже, что поведение webHttp или errorHandler может существовать само по себе, но они не будут сосуществовать.

1 Ответ

2 голосов
/ 08 ноября 2011

Ваш <errorHandler> уже является WebHttpBehavior (это поведение, связанное с элементом конфигурации <webHttp/>). Вам следует обновить расширение вашего поведения, связанное с <errorHandler>, чтобы понять параметры, которые вы хотите передать в WebHttpBehavior, и иметь только это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...