我一直在寻找几个小时无济于事。
我正在尝试使用 JSON.net 作为 ASP.NET 网站上 WCF Web 服务 (.svc) 的默认序列化程序和反序列化程序。需要明确的是,这不是一个 MVC 站点。只是托管在 IIS 7 中的普通旧 ASP.NET 4.0。
我最初的动机是使用 JSON.net 的高级日期处理,但现在我只想看看它是否可以完成。
下面是一个简单的 web 服务,可以返回日期或获取日期。使用 jQuery ajax 从页面调用此服务。
我想做的是以某种方式将 ASP.NET 配置为始终使用 JSON.net 反序列化例程而不是内置的 DataContractJsonSerializer 或实际调用的任何内容。我知道我可以将字符串传递并返回给我的服务方法,手动处理序列化,但如果可能的话,我想避免这种情况。
据我所知,这可能是不可能的,因为 .svc 内部化了序列化例程。这也是一个可以接受的答案。
谢谢!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using System.Text;
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
DateTime GetDateTime();
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
void SendDate(DateTime dt);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Text;
using AutoMapper;
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
public DateTime GetDateTime()
{
DateTime dt = new DateTime(2012, 01, 02, 03, 04, 05);
return dt;
}
public void SendDate(DateTime dt)
{
DateTime d = dt;
//Do something with the date
}
}
Service.svc
<%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
Web.config relevant lines:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>