我在WCF服务中使用WebServiceHostFactory,以避免在web.config中创建绑定配置的瑕疵。
但是,我想将服务公开为XML / JSON和JSONP。
看起来我不能扩展WCF来添加JSONP而不需要使用大量的自定义绑定配置。
那么,对于那些已经完成它的人,是否有可能拥有一个宁静的WCF服务,该服务根据UriTemplate以XML / JSON / JSONP响应,而不需要大量的配置连接?
答案 0 :(得分:3)
JSONP仅在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。
使用catch-all消息输入/输出合同并手动路由服务调用。见样本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();
答案 1 :(得分:2)
我认为您应该能够通过在服务合同中使用具有不同响应格式的不同方法来轻松实现这一点:
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扩展。但据我所知,它应该是您服务器上的一次性事物。
如果您真的无法处理此配置设置,您当然可以从用于WCF REST服务的WebServiceHostFactoryWithJSONPSupport
派生自定义WebServiceHostFactory
,并添加必要的扩展(如服务行为)等)到您的主机工厂。这个课程没有密封,因此应该足够简单(至少在理论上:-))。
答案 2 :(得分:0)
只是为了让您知道WCF数据服务(前Astoria)支持直接使用OData和JSON。
无需任何编码。在VS 2010中,您只需:
这会自动创建一个REST-ful Web服务,该服务根据提供的配置发出JSON或Atom。默认为ATOM,要获取JSON格式的数据,必须在客户端“Accept”标题中指定“application / json”。
要制作JSONP,需要做一些工作,请检查以下链接: Link 1