我遇到了同樣的問題,這裏有一個解決辦法。基本上你需要做的是創建一個行爲擴展,在發送響應時會改變內容類型。
你的web.config需要包括像:
<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>
然後你需要創建一個從BehaviorExtensionElement
繼承
public class ServiceContentTypeBehaviorExtensionElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new ServiceContentTypeMessageInspector();
}
public override Type BehaviorType
{
get
{
return typeof(ServiceContentTypeMessageInspector);
}
}
}
然後終於實現IDispatchMessageInspector和類的類IServiceBehavior,它努力改變內容類型:
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
}
應該按預期工作吧!
當它是text/html時,響應的主體是什麼?它是否包含錯誤消息(通常它會)? – carlosfigueira
您可以使用像fiddler這樣的工具來查看瀏覽器正在使用的accept-Header(或使用調試器檢查WebOperationContext.Current.IncomingRequest)。至少你可以通過這種方式排除瀏覽器問題。 –
瀏覽器的Accept頭是「text/html,application/xhtml + xml,application/xml; q = 0.9,*/*; q = 0.8」,我假設它只是FireFox的標準/默認值。響應主體是XML(正確和預期的XML),但問題在於響應內容類型爲text/html,因此瀏覽器不會將其視爲XML文檔,而是嘗試以HTML形式呈現。 –