处理WCF服务中的参数解析错误
本文关键字:错误 参数 WCF 服务 处理 | 更新日期: 2023-09-27 18:16:59
我有一个wcf服务,它接收一个DateTime作为参数。如果日期时间输入不正确,它返回一个我不想要的html页面。有没有办法让它返回一个自定义对象?
的例子:
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/GetData?DataDate={DataDate})]
Data[] GetData(DateTime DataDate);
因此,如果例如我传递这个url,其中月份号码无效,它返回一个网页错误,这是没有使用的人通过另一个应用程序发送消息。
http://localhost/API/GetData?DataDate=2014-108-06
反应:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"[]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Request Error</title>
<style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style>
</head>
<body>
<div id="content">
<p class="heading1">Request Error</p>
<p xmlns="">The server encountered an error processing the request. Please see the <a rel="help-page" href="http://localhost:1234/CheckAPI/help">service help page</a> for constructing valid requests to the service.</p>
</div>
</body>
</html>
如果在我的代码中发生错误,我返回一个自定义错误对象,如:
<Error>
<ErrorCode>4</ErrorCode>
<ErrorDescription>No data found for specified date. </ErrorDescription>
</Error>
理想情况下,我希望能够返回一个错误,如:
<Error>
<ErrorCode>5</ErrorCode>
<ErrorDescription>Error parsing DataDate value.</ErrorDescription>
</Error>
编辑:我已经尝试实现IErrorHandler和IParameterInspector,但这些只允许我处理参数已经被验证后的错误。堆栈跟踪如下:
<ExceptionType>System.FormatException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>String was not recognized as a valid DateTime.</Message>
<StackTrace>
at System.DateTime.Parse(String s, IFormatProvider provider, DateTimeStyles styles)
at System.ServiceModel.Dispatcher.QueryStringConverter.ConvertStringToValue(String parameter, Type parameterType)
at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
</StackTrace>
当你应用你的检查器时,你也可以通过反射访问方法:OperationDescription.SyncMethod。然后,您可以检查方法参数,并决定如何检查参数。例如,你可以访问方法参数的自定义属性,并将这些属性传递给你的parametersinspectorconstructor——这样你的检查器就会知道如何验证提供的参数。
但是无论如何,WCF调用这些指令的顺序是:internal void InvokeBegin(ref MessageRpc rpc)
{
...
this.InitializeCallContext(ref rpc);
object target = rpc.Instance;
this.DeserializeInputs(ref rpc);
this.InspectInputs(ref rpc);
...
所以你可以看到检查只发生在反序列化之后,所以你必须提供你自己的Formatter来处理格式错误