在以下示例URI定义
中[WebGet(UriTemplate = "GetData?value={value}")]
[OperationContract]
string GetData(int value);
{
return string.Format("You entered: {0}, value);
}
“value”参数默认是可选的,如果我没有传递它(调用http://baseAddress/GetData
),变量将填充为零。
是否有任何简单的方法可以使这个参数,可能是一个属性?我找到的唯一方法是手动检查WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["value"] != null
。
我讨厌的另一件事是为/GetData?value=emptyOrAnythingThatIsNotAnInteger
返回HTTP 500。我可以返回HTTP 400吗?当然,无需将类型更改为字符串并手动检查所有内容。
答案 0 :(得分:1)
您可以使用字符串而不是int,然后执行自己的验证并输入强制(如果未传递,则字符串将为null)。然后,如果参数不正确,您可以返回400
答案 1 :(得分:1)
传递除整数以外的值时出现500错误的原因是WCF尝试解析传递给整数的值,并且在此阶段您的请求已被接收并已启动以供服务处理。
只有当消息在通道上并且WCF不理解传入消息的消息格式并且它需要按照服务的指定进行转换时,才会收到400错误。
为了检查你的值并返回400错误,请尝试使用“MessageInspectors”,其中有IDispatcherMessageInspector的“AfterReceiveRequest”方法。可以找到有关消息检查器的一些信息here。