J'ai rencontré le même problème, voici un travail autour. Essentiellement ce que vous devez faire est de créer une extension de comportement qui va changer le type de contenu lors de l'envoi de la réponse.
Votre web.config devrait inclure quelque chose comme:
<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>
Ensuite, vous devrez créer une classe qui hérite de BehaviorExtensionElement
public class ServiceContentTypeBehaviorExtensionElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new ServiceContentTypeMessageInspector();
}
public override Type BehaviorType
{
get
{
return typeof(ServiceContentTypeMessageInspector);
}
}
}
Et puis enfin une classe qui implémente IDispatchMessageInspector et IServiceBehavior qui effectue le dur travail de modification du type de contenu:
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
}
Devrait fonctionner comme prévu maintenant!
Quel est le corps de la réponse quand il s'agit de text/html? Contient-il un message d'erreur (ce qui est souvent le cas)? – carlosfigueira
Vous pouvez utiliser un outil comme fiddler pour voir ce que accepte le Header du navigateur (ou inspecter le WebOperationContext.Current.IncomingRequest en utilisant le débogueur). Au moins, vous pourriez exclure un problème de navigateur de cette façon. –
L'en-tête Accept du navigateur est "text/html, application/xhtml + xml, application/xml; q = 0.9, */*; q = 0.8" ce que je suppose être juste la norme/défaut FireFox. Le corps de la réponse est XML (le XML correct et attendu), mais le problème est que le type de contenu de la réponse est text/html, de sorte que le navigateur ne le traite pas comme un document XML mais plutôt comme HTML. –