我的端点中配置了两个行为:
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时,一切正常。当我添加第二个行为时,我得到以下异常:
{" 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>
有什么想法吗?
答案 0 :(得分:0)
为什么要从NewtonsoftJsonContentTypeMapper返回WebContentFormat.Raw?你不应该返回WebContentFormat.Json,以便格式正确匹配吗?
你能澄清一下你想要完成的事情吗?
答案 1 :(得分:0)
这就解决了我的问题:
在web.config中,我只是在<newtonsoftJsonBehavior/>
和<jsonErrorBehavior/>
之间切换了顺序。
我承认我并不完全理解所有这些行为,也不知道它为什么会有所帮助,但确实如此。