0

如果启用 AJAX 的 WCF 应返回一个对象,其日期属性为 Nothing,则对该服务的请求将失败。

测试.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

Testform.aspx 上的脚本标签

<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>

Chrome 在此调用中显示以下错误消息:“加载资源失败”。

有没有人对这种行为有解释/想法,你应该如何防止这个问题?

谢谢你的建议 ;)

4

1 回答 1

1

如果您希望能够分配Nothing给一个DateTime字段,您应该使其可以为空:

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

我不是 VB.NET 专家,但据我所知,VB.NET 中的关键字是DateTimeDate结构的别名(不能为空),除了 VB.NET 必须做一些黑色的巫术魔法才能让你没有分配任何东西。除了当序列化程序尝试将其序列化为 JSON 时,会引发以下异常:

尝试序列化参数 WebApp:TestOperationResult 时出错。InnerException 消息是“转换为 UTC 时大于 DateTime.MaxValue 或小于 DateTime.MinValue 的 DateTime 值无法序列化为 JSON。”。有关更多详细信息,请参阅 InnerException。

于 2012-05-02T08:59:19.333 回答