[英]Bad Request to RESTful WCF Service Forces IIS to Recycle App Pool
我正在尝试创建和托管一个简单的RESTful WCF服务。 除1种情况外,该服务均正常运行。 我尝试执行POST,以使用以下JSON请求将新对象插入到我的静态列表中:
{"sampleItem":{"Id":1,"StartValue":2,"EndValue":3}}
如果然后将请求更改为:
{"sampleItemBlah":{"Id":1,"StartValue":2,"EndValue":3}}
我得到500响应,并且所有以后的POST都返回500错误,直到我回收IIS App Pool,然后它又开始工作。
服务似乎没有出现故障,因为我仍然可以执行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>
任何帮助都将不胜感激。
原来,问题出在使用标签:
BodyStyle = WebMessageBodyStyle.Wrapped
当我删除它时,要求具有:
{"sampleItem":{"Id":1,"StartValue":2,"EndValue":3}}
转换成:
{"Id":1,"StartValue":2,"EndValue":3}
这将强制转换为正确的对象类型,如果不存在该字段,则将值设置为null或类型的默认空值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.