我有 WCF 4.0 REST 服务。automaticFormatSelectionEnabled如果我在文件中启用web.config,则服务将根据 HTTP“Accept”标头正确选择序列化为 XML 或 JSON。
但是,当我使用浏览器发出 GET 命令时,响应正文会以 XML 格式返回,但 HTTP 内容类型标头为“text/html”。这会导致浏览器无法意识到响应是 XML,并尝试将其呈现为 html(这当然效果不佳)。这使得在浏览器中测试我的 GET 方法变得更加困难。
如果我禁用automaticFormatSelectionEnabled,那么一切都会按预期工作(响应正文包含 XML,HTTP 内容类型为“application/xml”),但是,我希望能够根据请求自动切换到 JSON。
通过浏览器请求时,是否有某种方法可以使内容类型正确返回?
我遇到了同样的问题,这是一个解决方法。本质上,您需要做的是创建一个行为扩展,它将在发送响应时更改内容类型。
您的 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>
Run Code Online (Sandbox Code Playgroud)
然后您需要创建一个继承自BehaviorExtensionElement的类
public class ServiceContentTypeBehaviorExtensionElement : BehaviorExtensionElement
{
protected override object CreateBehavior()
{
return new ServiceContentTypeMessageInspector();
}
public override Type BehaviorType
{
get
{
return typeof(ServiceContentTypeMessageInspector);
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后是一个实现 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
}
Run Code Online (Sandbox Code Playgroud)
现在应该可以按预期工作了!
| 归档时间: |
|
| 查看次数: |
2793 次 |
| 最近记录: |