WCF如何根据请求决定何时返回SOAP或JSON?

时间:2011-09-20 00:28:48

标签: wcf json http rest wcf-rest

我刚刚创建了我的第一个WCF REST服务。我希望它返回JSON,所以我指定了响应格式。起初,我很沮丧,因为它一直在返回SOAP,我不知道为什么,但我看到一个博主正在使用Fiddler,所以我尝试了它,然后我得到了一个JSON响应。

我认为原因是因为Fiddler没有发送此HTTP标头:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

但后来我试图用这个标题制作一个请求:

Accept: application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

但它没有用。 WCF如何决定何时使用JSON或SOAP?

有没有办法强制总是返回JSON?

我想确保当我使用该服务时,它将返回JSON而不是SOAP。

感谢。

更新:示例代码:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1
{
    [WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json, RequestFormat= WebMessageFormat.Json)]
    public List<SampleItem> GetCollection()
    {
        // TODO: Replace the current implementation to return a collection of SampleItem instances
        return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } };
    }

    [WebInvoke(UriTemplate = "", Method = "POST")]
    public SampleItem Create(SampleItem instance)
    {
        // TODO: Add the new instance of SampleItem to the collection
        throw new NotImplementedException();
    }

    [WebGet(UriTemplate = "{id}", ResponseFormat = WebMessageFormat.Json)]
    public SampleItem Get(string id)
    {
        // TODO: Return the instance of SampleItem with the given id
        return new SampleItem() { Id = Int32.Parse(id), StringValue = "Hello" };
    }
}

3 个答案:

答案 0 :(得分:2)

我有像这样的端点行为

<endpointBehaviors>
  <behavior name="jsonEndpoint">
    <webHttp defaultOutgoingResponseFormat="Json" />
  </behavior>
</endpointBehaviors>

如果将此配置为端点行为,则无需触及操作合同,如果通过不同的端点访问它们,则可以生成不同的输出。

我还不完全确定的一件事是关于WCF似乎产生的两种不同的Json样式。如果使用enableWebScript,这将产生{“d”:{...}} Json格式,defaultOutgoingResponseFormat选项设置为Json,不会有d-object,只有Json。

答案 1 :(得分:1)

我需要查看您的代码以了解您到底在做什么。但是在这里快速检查一下。您是否已将以下属性应用于服务定义?

[System.ServiceModel.Web.WebGet(ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json)]

答案 2 :(得分:0)

您是否尝试过设置服务配置以使用webHttpBinding?

Expose webHttpBinding endpoint in a WCF service