I ran into the same problem, here is the job. Essentially, you need to create a behavior that changes the type of content when sending a response.
Your web.config file should say something like:
<behaviors> <serviceBehaviors> <behavior name="WebServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> <MessageInspector/> </behavior> </serviceBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="MessageInspector" type="Namespace.ServiceContentTypeBehaviorExtensionElement, assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions>
Then you will need to create a class that inherits from BehaviorExtensionElement
public class ServiceContentTypeBehaviorExtensionElement : BehaviorExtensionElement { protected override object CreateBehavior() { return new ServiceContentTypeMessageInspector(); } public override Type BehaviorType { get { return typeof(ServiceContentTypeMessageInspector); } } }
And finally, a class that implements IDispatchMessageInspector and IServiceBehavior, which does the hard work of changing the type of content:
public class ServiceContentTypeMessageInspector : IDispatchMessageInspector, IServiceBehavior { #region IDispatchMessageInspector public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) { return null; } public void BeforeSendReply(ref Message reply, object correlationState) { // inspect and/or modify the reply if (WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.ContentType] == "text/html; charset=utf-8" && WebOperationContext.Current.OutgoingResponse.Format == WebMessageFormat.Xml) { WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.ContentType] = "application/xml; charset=utf-8"; } } #endregion #region IServiceBehavior public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) { foreach (var endpoint in dispatcher.Endpoints) { endpoint.DispatchRuntime.MessageInspectors.Add(new ServiceContentTypeMessageInspector()); } } } public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { } public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { } #endregion }
Now work as expected!
source share