Как WCF решает, когда возвращать SOAP или JSON в зависимости от запроса? - PullRequest
1 голос
/ 20 сентября 2011

Я только что создал свой первый сервис 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 ]

2 голосов
/ 20 сентября 2011

У меня есть поведение конечной точки, как это

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

Если вы сконфигурируете это как поведение конечной точки, вам не нужно трогать ваши контракты на выполнение операций, и они могут давать различный вывод, если к ним обращаются через другую конечную точку.

Единственное, в чем я не совсем уверен, так это в двух разных стилях Json, которые, похоже, создает WCF. Если вы используете enableWebScript, это создаст формат Json {"d": {...}}, а для параметра defaultOutgoingResponseFormat, установленного в Json, не будет d-объекта, а будет только Json.

1 голос
/ 20 сентября 2011

Мне нужно посмотреть на ваш код, чтобы понять, что именно вы делаете.Но быстрая проверка здесь.Применяли ли вы следующие атрибуты к определению вашей услуги?

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

0 голосов
/ 13 февраля 2013

Вы пытались настроить конфигурацию службы для использования webHttpBinding?

Предоставить конечную точку webHttpBinding в службе WCF

...