Неверный запрос к службе RESTful WCF заставляет IIS перезагружать пул приложений - PullRequest
0 голосов
/ 03 марта 2010

Я пытаюсь создать и разместить простую службу RESTful WCF. Сервис работает отлично за исключением 1 ситуации. Я пытаюсь выполнить POST для вставки нового объекта в мой статический список с помощью запроса JSON:

{"sampleItem":{"Id":1,"StartValue":2,"EndValue":3}}

Если я изменю запрос на:

{"sampleItemBlah":{"Id":1,"StartValue":2,"EndValue":3}}

Я получаю ответ 500, и все будущие POST возвращают ошибку 500, пока я не перезапущу свой пул приложений IIS, а затем он снова начнет работать.

Не похоже, что служба находится в неисправном состоянии, потому что я все еще могу выполнить GET и получить данные обратно. Я включил отладку трассировки и не вижу никаких ошибок в моем файле журнала.

У кого-нибудь есть идеи?

Вот мой сервисный контракт:

[ServiceContract]
public interface IWcfRestService
{
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    SampleItem Insert(SampleItem sampleItem);
}

[DataContract]
public class SampleItem
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public int StartValue { get; set; }
    [DataMember]
    public int EndValue { get; set; }
}

А вот моя реализация:

public class WcfRestService : IWcfRestService
{
    private static readonly List<SampleItem> Items = new List<SampleItem>();

    public SampleItem Insert(SampleItem sampleItem)
    {
        return BaseInsert(sampleItem);
    }

    private static SampleItem BaseInsert(SampleItem sampleItem)
    {
        if (Items.Exists(x => x.Id == sampleItem.Id))
            Items.RemoveAll(x => x.Id == sampleItem.Id);

        Items.Add(sampleItem);

        return sampleItem;
    }
}

И, наконец, вот мой раздел ServiceModel моего Web.config:

<services>
  <service behaviorConfiguration="Services.ServiceBehavior" 
           name="WcfRestServiceApp.WcfRestService">
    <endpoint address="" 
              behaviorConfiguration="RESTBehavior" 
              binding="webHttpBinding"
              contract="WcfRestServiceApp.IWcfRestService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="RESTBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="Services.ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 09 марта 2010

Оказалось, что проблема была с использованием тега:

BodyStyle = WebMessageBodyStyle.Wrapped

Когда я его убрал, требование иметь:

{"sampleItem":{"Id":1,"StartValue":2,"EndValue":3}}

превратился в:

{"Id":1,"StartValue":2,"EndValue":3}

Это вынудило приведение к правильному типу объекта и, если поле отсутствовало, оно установило значение в null или пустое значение по умолчанию типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...