对RESTful WCF服务的错误请求强制IIS回收应用程序池

时间:2010-03-03 14:23:20

标签: c# wcf rest iis

我正在尝试创建和托管一个简单的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;
    }
}

最后这是我的Web.config的ServiceModel部分:

<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 :(得分:0)

事实证明问题在于使用标签:

BodyStyle = WebMessageBodyStyle.Wrapped

当我删除它时,要求:

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

变成:

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

这会强制转换为正确的对象类型,如果该字段不存在,则将值设置为null或类型的默认空值。