1

ServiceStack を使用して Rest Service を開発しています。私のモデルには DateTime プロパティが含まれており、問題はそこから始まります。クライアントが誤った形式の日付値を string として投稿または取得した場合、ServiceStack は「String は有効な DateTime として認識されませんでした」という例外を発生させます。

Stack Trace: 


[FormatException: String was not recognized as a valid DateTime.]
   System.DateTime.Parse(String s, IFormatProvider provider, DateTimeStyles styles) +6364458
   ServiceStack.Text.Common.DeserializeBuiltin`1.<GetParseFn>b__b(String value) in C:\src\ServiceStack.Text\src\ServiceStack.Text\Common\DeserializeBuiltin.cs:58
   ServiceStack.ServiceModel.Serialization.StringMapTypeDeserializer.PopulateFromMap(Object instance, IDictionary`2 keyValuePairs) in C:\src\ServiceStack\src\ServiceStack.Common\ServiceModel\Serialization\StringMapTypeDeserializer.cs:79

[SerializationException: KeyValueDataContractDeserializer: Error converting to type: String was not recognized as a valid DateTime.]
   ServiceStack.ServiceModel.Serialization.StringMapTypeDeserializer.PopulateFromMap(Object instance, IDictionary`2 keyValuePairs) in C:\src\ServiceStack\src\ServiceStack.Common\ServiceModel\Serialization\StringMapTypeDeserializer.cs:95
   ServiceStack.ServiceHost.RestPath.CreateRequest(String pathInfo, Dictionary`2 queryStringAndFormData, Object fromInstance) in C:\src\ServiceStack\src\ServiceStack\ServiceHost\RestPath.cs:319
   ServiceStack.WebHost.Endpoints.RestHandler.GetRequest(IHttpRequest httpReq, IRestPath restPath) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\RestHandler.cs:104
   ServiceStack.WebHost.Endpoints.RestHandler.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, String operationName) in C:\src\ServiceStack\src\ServiceStack\WebHost.Endpoints\RestHandler.cs:80
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +625
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +270

私はそれがエラーであることを知っており、それがキャッチでなければならないことを知っていますが、エラーコードとエラーの説明 (人間に優しい) を使用して実装したいと考えています。

(DebeugMode = true)で応答自体に書き込まれる前に例外をキャッチする方法、またはサービスがクライアントに例外を発生させる方法についてのアドバイスは非常に役立ちます。

thnx

4

1 に答える 1

3

カスタムリクエストバインダーを追加して(またはより高度なオプションは、DTOにIRequiresRequestStreamを実装することです)、独自のServiceStackの逆シリアル化をバイパスします。

これに関する詳細は、ServiceStackのwikiドキュメントに含まれています。

于 2012-07-24T16:06:59.630 に答える