如果启用AJAX的WCF应该返回一个Date属性为Nothing的Object,则对此服务的请求失败。
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
Testform.aspx上的脚本标签
<script type="text/javascript">
$(document).ready(function () {
$.getJSON('./Test.svc/TestOperation', function (data) {
alert(data.d.DateProp);
});
});
</script>
Web.config(serviceModel部分)
<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在此调用中显示以下错误消息:“无法加载资源”。
有没有人对此行为有任何解释/想法,您应该如何防止此问题?
感谢您的建议;)
答案 0 :(得分:1)
如果您希望能够将Nothing
分配到DateTime
字段,则应将其置为可空:
<DataMember()>
Public Property DateProp() As Nullable(Of DateTime)
我不是VB.NET专家,但据我所知,VB.NET中的Date
关键字是DateTime结构的别名(不可为空),除了VB。 NET必须做一些黑巫术魔法才能让你为它分配任何东西。除了当序列化程序尝试将其序列化为JSON时,抛出以下异常:
尝试序列化参数时出错 Web应用程序:TestOperationResult。 InnerException消息是'DateTime 值大于DateTime.MaxValue或小于 转换为UTC时的DateTime.MinValue无法序列化 JSON。“。有关详细信息,请参阅InnerException。