繁体   English   中英

WCF 4.0 Rest Service返回内容类型text / html

[英]WCF 4.0 Rest Service returns content-type text/html

我有一个WCF 4.0 REST服务。 如果我在web.config文件中启用了automaticFormatSelectionEnabled ,那么服务将在基于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>

然后,您将需要创建一个继承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
}

应该按预期工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM