Обработчик ошибок WCF json вызывает исключение
У меня есть два поведения, настроенные в моей конечной точке:
- Один для сериализации JSON, который в основном очень похож на пример здесь. Здесь важно следующее:
public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(NewtonsoftJsonBehavior); } } protected override object CreateBehavior() { return new NewtonsoftJsonBehavior(); } } public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper { public override WebContentFormat GetMessageFormatForContentType(string contentType) { return WebContentFormat.Raw; } }
- Другой для обработки ошибок. Чтобы при возникновении исключения клиенту отправлялось сообщение в формате json. Код взят отсюда (ответ начинается с: "Вот полное решение, основанное на некоторой информации сверху:").
когда я использую только поведение 1, все работает нормально. Когда я добавляю второе поведение, я получаю следующее исключение:
{"ExceptionType": "System.InvalidOperationException", "Message": "Входящее сообщение имеет неожиданный формат сообщения" Raw ". Ожидаемые форматы сообщений для операции:" Xml "," Json ". Это может быть потому, что WebContentTypeMapper не был настроен для привязки. Для получения дополнительной информации см. документацию WebContentTypeMapper. "}
Вот как выглядит мой web.config:
<services>
<service name="Algotec.Services.Archive.Data.ArchiveDataService" behaviorConfiguration="defaultBehavior">
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="Algotec.Interfaces.Archive.Data.IArchiveData" bindingNamespace="http://algotec.co.il/ArchiveData"/>
<endpoint name="restXml" address="" binding="webHttpBinding" contract="Algotec.Interfaces.Archive.Data.IArchiveData" behaviorConfiguration="restBehavior" bindingNamespace="http://algotec.co.il/ArchiveData"/>
<endpoint name="restJson" address="json" binding="webHttpBinding" contract="Algotec.Interfaces.Archive.Data.IArchiveData" behaviorConfiguration="jsonBehavior" bindingConfiguration="jsonBinding" bindingNamespace="http://algotec.co.il/ArchiveData"/>
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
</service>
</services>
...
<endpointBehaviors>
<behavior name="restBehavior">
<enhancedWebHttp defaultOutgoingRequestFormat="Xml" defaultOutgoingResponseFormat="Xml"/>
</behavior>
<behavior name="jsonBehavior">
<enhancedWebHttp defaultOutgoingRequestFormat="Json" defaultOutgoingResponseFormat="Json" helpEnabled="true"/>
<newtonsoftJsonBehavior/>
<jsonErrorBehavior/>
</behavior>
</endpointBehaviors>
...
<extensions>
<behaviorExtensions>
<add name="newtonsoftJsonBehavior" type="Algotec.Services.Infra.BehaviorExtensions.NewtonsoftJsonBehaviorExtension, Algotec.Services.Infra, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
<add name="jsonErrorBehavior" type="Algotec.Services.Infra.Behaviors.JsonErrorWebHttpBehaviorElement, Algotec.Services.Infra, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
Есть идеи?
2 ответа
Вот что решило мою проблему:
В web.config я просто переключил порядок между <newtonsoftJsonBehavior/>
а также <jsonErrorBehavior/>
, Я признаю, что я не совсем понимаю все это поведение и не знаю, почему это помогло, но это помогло.
Почему вы возвращаете WebContentFormat.Raw из NewtonsoftJsonContentTypeMapper? Разве вы не должны возвращать WebContentFormat.Json, чтобы формат соответствовал правильно?
Можете ли вы немного уточнить, что вы пытаетесь достичь?