我在 WCF 服务中使用 WebServiceHostFactory 以避免在 web.config 中创建绑定配置的废话。
但是,我想将服务公开为 XML/JSON 和 JSONP。
看起来我可以扩展 WCF 以添加 JSONP 而无需求助于大量自定义绑定配置。
那么,对于那些已经做过的人,是否有可能拥有一个安静的 WCF 服务,它根据 UriTemplate 以 XML/JSON/JSONP 响应,而无需使用大量的配置连接?
我在 WCF 服务中使用 WebServiceHostFactory 以避免在 web.config 中创建绑定配置的废话。
但是,我想将服务公开为 XML/JSON 和 JSONP。
看起来我可以扩展 WCF 以添加 JSONP 而无需求助于大量自定义绑定配置。
那么,对于那些已经做过的人,是否有可能拥有一个安静的 WCF 服务,它根据 UriTemplate 以 XML/JSON/JSONP 响应,而无需使用大量的配置连接?
JSONP 仅通过自定义绑定 pre-NET4 可用。在 .NET 4 中,他们在 WebHttpBinding 上添加了一个名为 crossDomainScriptAccessEnabled 的新属性,该属性增加了对 JSONP 的支持。见http://www.bendewey.com/blog/index.php/186/using-jsonp-with-wcf-and-jquery
至于使用 UriTemplates 在一项服务中接受 XML 和 JSON,我在此演示文稿中描述了两种技术http://www.bendewey.com/blog/index.php/176/alt-net-rest-presentation (也可在此处获得完整源代码)。
使用两个入口方法并使用内部方法处理调用。请参见示例 1。
使用包罗万象的消息输入/输出合同并手动路由服务呼叫。见样本 2。
[OperationContract]
[WebGet(UriTemplate = "/")]
Years GetYears();
[OperationContract]
[WebGet(UriTemplate = "/json/", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Years GetJsonYears();
Years GetYearsInternal();
[OperationContract]
[WebGet(UriTemplate = "*")]
Message Get();
我认为您应该可以通过在服务合同中使用具有不同响应格式的不同方法来轻松做到这一点:
interface IYourService
{
[OperationContract]
[WebGet(UriTemplate="/YourMethod/XML", ResponseFormat=WebMessageFormat.Xml)]
SomeReturnObject YourMethodAsXml(.....);
[OperationContract]
[WebGet(UriTemplate="/YourMethod/JSON", ResponseFormat=WebMessageFormat.Json)]
SomeReturnObject YourMethodAsJson(.....);
}
然后这两种方法都可以调用一个通用的核心函数,该函数执行实际的数据计算/查找数据或您正在做的任何事情。
我想说的是,没有大的配置战争涉及到......它会解决你的三个点中的至少两个(XML 和 JSON)。
WCF 本身不支持 JSONP - 但正如您引用的文章所示,您可以相当轻松地添加此行为。不过,这确实需要一些配置连接才能启用此 WCF 扩展。但据我所知,这应该是您服务器上的一次性事情。
如果您真的无法处理此配置设置,您当然可以WebServiceHostFactoryWithJSONPSupport
从WebServiceHostFactory
用于 WCF REST 服务的自定义中派生出一个自定义,并将必要的扩展(如服务行为等)添加到您的主机工厂。该类不是密封的,因此应该足够简单(至少在理论上:-))。
只是为了让您知道 WCF 数据服务(前 Astoria)直接支持 OData 和 JSON。
无需任何编码。在 VS 2010 中,您只需:
这会自动创建一个基于提供的配置发出 JSON 或 Atom 的 REST-ful Web 服务。默认为 ATOM,要获取 JSON 格式的数据,您必须在客户端“Accept”标头中指定“application/json”。
要制作 JSONP,需要做一些工作,请查看此链接: 链接 1