Служба REST wcf 3.5 работает с XML, но не с форматом ответа JSON - PullRequest
2 голосов
/ 17 августа 2010

У меня есть контракт на обслуживание с несколькими контрактами на эксплуатацию.Я добавил новую конечную точку, чтобы представить свои операции как спокойный веб-сервис.Более того, я обновил определения операций, чтобы их можно было вызывать RESTful

    [OperationContract]
    [WebInvoke(
    Method = "GET",
    ResponseFormat = WebMessageFormat.Xml,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "product/getall")]   
    Product[] GetAll()

Все отлично работает, мои продукты возвращаются в виде XML ... но я бы хотел использовать вместо этого JSON.Если я изменю код на

[OperationContract]
[WebInvoke(
Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "product/getall")]   
Product[] GetAll()

Ответ на вызов продукта / getall будет пустым.Никаких исключений не выдается, но у меня плохое предчувствие, что реализация WCF JSON как-то не справляется с сериализацией.У кого-нибудь была похожая проблема?Какие-либо предложения?Можно ли использовать JSON.NET для сериализации / десериализации моих объектов?

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Я смог заставить это работать - вот что я сделал. Прежде всего, моя среда VS2010, и я использовал веб-сервер VS (Cassini).

Я не изменил подпись вашего метода или атрибут WebInvoke. Тело метода GetAll() таково:

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "product/getall")]
Product[] GetAll()
{
    Product[] prods = new Product[3] {
        new Product() { Name="Foo", Desc="Bar"},
        new Product() {Name="Ha", Desc="Ho"},
        new Product() {Name="Who", Desc="What"}
    };

    return prods;
}

web.config выглядит так:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="WebApplication2.ProdServiceAspNetAjaxBehavior">
              <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
        multipleSiteBindingsEnabled="true" />
    <services>
        <service name="WebApplication2.ProdService">
            <endpoint address="" behaviorConfiguration="WebApplication2.ProdServiceAspNetAjaxBehavior"
                binding="webHttpBinding" contract="WebApplication2.ProdService" />
        </service>
    </services>
</system.serviceModel>

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

РЕДАКТИРОВАТЬ (забыл класс Product) : Вот класс Product - я украсил его атрибутами DataContract и DataMember:

[DataContract]
public class Product
{
    [DataMember()]
    public String Name { get; set; }
    [DataMember()]
    public String Desc { get; set; }
}

Это был мой вывод:

[{"Desc":"Bar","Name":"Foo"},{"Desc":"Ho","Name":"Ha"},{"Desc":"What","Name":"Who"}]

Я предполагаю, что вы используете enableWebScript в вашем web.config. Измените его на webHttp и посмотрите, что произойдет. Параметр enableWebScript используется для большей совместимости с ASMX (я полагаю). Если вы возвращаете JSON (что делают многие из моих методов обслуживания GET), используйте webHttp (это то, к чему я привык).

Дайте мне знать, что вы получите, и я обновлю свой ответ соответственно.

1 голос
/ 17 августа 2010

Включите трассировку WCF и просмотрите журнал трассировки. Это должно точно определить, где проблема. Вы можете настроить ваш web.config со следующими настройками, чтобы включить трассировку.

<system.serviceModel>
  <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
  </diagnostics>
</system.serviceModel>

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
      propagateActivity="true">
      <listeners>
        <add type="System.Diagnostics.DefaultTraceListener" name="Default">
          <filter type="" />
        </add>
        <add name="ServiceModelTraceListener">
          <filter type="" />
        </add>
      </listeners>
    </source>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
      <listeners>
        <add type="System.Diagnostics.DefaultTraceListener" name="Default">
          <filter type="" />
        </add>
        <add name="ServiceModelMessageLoggingListener">
          <filter type="" />
        </add>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add initializeData="C:\Web_tracelog.svclog"
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
      <filter type="" />
    </add>
    <add initializeData="C:\Web_messages.svclog"
      type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
      name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
      <filter type="" />
    </add>
  </sharedListeners>
</system.diagnostics>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...