WCF json错误处理程序导致异常

时间:2014-10-07 12:59:59

标签: json wcf ierrorhandler wcf-behaviour

我的端点中配置了两个行为:

  1. 一个用于json序列化,它基本上与exmaple here非常相似。 重要的是以下内容:
  2. 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;
        }
    }
    
    1. 另一个是错误处理。因此,当抛出异常时,将向客户端发送json格式的消息。代码取自here(答案盯着:"这里是基于上述信息的完整解决方案:")。
    2. 当我只使用行为1时,一切正常。当我添加第二个行为时,我得到以下异常:

        

      {" ExceptionType":" System.InvalidOperationException""消息":"该   传入的消息具有意外的消息格式' 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 个答案:

答案 0 :(得分:0)

为什么要从NewtonsoftJsonContentTypeMapper返回WebContentFormat.Raw?你不应该返回WebContentFormat.Json,以便格式正确匹配吗?

你能澄清一下你想要完成的事情吗?

答案 1 :(得分:0)

这就解决了我的问题:

在web.config中,我只是在<newtonsoftJsonBehavior/><jsonErrorBehavior/>之间切换了顺序。 我承认我并不完全理解所有这些行为,也不知道它为什么会有所帮助,但确实如此。