2012-05-02 9 views
0

DateプロパティがNoneのオブジェクトをAJAX対応のWCFが返す必要がある場合、このサービスへの要求は失敗します。 Testform.aspxにDateプロパティがDateTime.MinValueの場合、AJAXが有効なWCFサービスが失敗する

Test.svc

Imports System.ServiceModel 
Imports System.ServiceModel.Activation 
Imports System.ServiceModel.Web 
Imports System.Runtime.Serialization 

<ServiceContract(Namespace:="WebApp")> 
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> 
Public Class Test 

    <OperationContract()> 
    <WebGet()> 
    Public Function TestOperation() As CompositeType 
     Dim obj As New CompositeType 
     obj.DateProp = Nothing 
     obj.StringProp = "Test" 
     Return obj 
    End Function 

End Class 

<DataContract()> 
Public Class CompositeType 
    <DataMember()> 
    Public Property DateProp() As Date 
    <DataMember()> 
    Public Property StringProp() As String 

End Class 

scripttagは

<script type="text/javascript"> 
    $(document).ready(function() { 
     $.getJSON('./Test.svc/TestOperation', function (data) { 
     alert(data.d.DateProp); 
     }); 
    }); 
</script> 

のWeb.config

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="WebApp.TestAspNetAjaxBehavior"> 
       <enableWebScript /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="WebApp.Test"> 
     <endpoint address="" behaviorConfiguration="WebApp.TestAspNetAjaxBehavior" 
     binding="webHttpBinding" contract="WebApp.Test" /> 
     </service> 
    </services> 
</system.serviceModel> 

クロムディスプレイこの上の(serviceModel部)は、以下を呼び出しますエラーメッセージ:「loaに失敗しましたdリソース "となります。

この動作の説明/考え方は誰にもありますが、どのようにしてこの問題を防ぐことができますか?

あなたのアドバイスをありがとう;)

+0

VB.NETについてはわかりませんが、C#ではDateTimeクラスをnullにすることはできません(ただし、nullを許可する場合を除く)。類似のものがここにあるのでしょうか? – Styxxy

+0

Nothing/nullを代入すると、1900年1月1日の0:0:0という日付になります。しかし、私がDateTime.Nowを代入すると、要求は機能します... – Nicholas

+0

日付フィールドを空にする(または、私たちが言うようにnullにする)場合は、フィールドはNULL可能でなければなりません。あなたの文脈で本当の意味を持っていない限り、いくつかの "ランダムな"値を割り当てないでください。 – Styxxy

答えて

1

をあなたはそれがNULL可能にする必要がありますDateTimeフィールドにNothingを割り当てることができるようにしたい場合:

<DataMember()> 
Public Property DateProp() As Nullable(Of DateTime) 

私はVB.NETの専門家ではないですけどとして私がVB.NETのDateキーワードがDateTime構造体のエイリアスであることは分かっていますが(Nullableではありません)、VB.NETはNothingを割り当てることを可能にするためにいくつかの黒いブードゥーの魔法をしていなければなりません。それを除いてシリアライザは、次の例外がスローされるJSONにそれをシリアル化しようとしたとき:TestOperationResult:パラメータ WebAppのをシリアル化しようとしているときに

エラーがありました。 InnerExceptionメッセージが 'DateTimeDateTime.MaxValueより大きい値または DateTime.MinValueより小さい値をUTCに変換した場合、 JSONにシリアル化できません。'詳細については、InnerExceptionを参照してください。

+0

割り当てられていない日付はDateTime.MinValueと等しくないはずですか? (少なくとも 'CDate(Nothing).Equals(DateTime.MinValue)'はTrueを返します) – Nicholas

+0

@Nicholasはい、それは 'DateTime'型を使うときに起こります。あなたのプロパティで 'Date'エイリアスを' DateTime'に置き換えてください。値を割り当てなければ、デフォルト値であるDateTime.MinValueに自動的に割り当てられます。 –

+0

うん。しかし、あなたが引用した例外メッセージには、「... DateTime.MinValue ...より小さい」というものがあります。これはJSONシリアライザのバグですか? – Nicholas

関連する問題