【问题标题】:Configurationless WCF using Factories and JSONP使用工厂和 JSONP 的无配置 WCF
【发布时间】:2011-01-22 01:02:45
【问题描述】:

我在我的 WCF 服务中使用 WebServiceHostFactory 以避免在 web.config 中创建绑定配置的废话。

但是,我想将服务公开为 XML/JSON 和 JSONP。

阅读:http://jasonkelly.net/archive/2009/02/24/using-jquery-amp-jsonp-for-cross-domain-ajax-with-wcf-services.aspx

看起来我可以扩展 WCF 以添加 JSONP 而无需求助于大量自定义绑定配置。

那么,对于那些已经做过的人,是否有可能拥有一个安静的 WCF 服务,它根据 UriTemplate 以 XML/JSON/JSONP 响应,而无需使用大量的配置连接?

【问题讨论】:

    标签: wcf jsonp


    【解决方案1】:
    1. JSONP 仅可通过自定义绑定 pre-NET4 获得。在 .NET 4 中,他们在 WebHttpBinding 上添加了一个名为 crossDomainScriptAccessEnabled 的新属性,该属性增加了对 JSONP 的支持。见http://www.bendewey.com/blog/index.php/186/using-jsonp-with-wcf-and-jquery

    2. 至于使用 UriTemplates 在一项服务中接受 XML 和 JSON,我在此演示文稿中描述了两种技术 http://www.bendewey.com/blog/index.php/176/alt-net-rest-presentation(也可在此处获得完整源代码)。

      1. 使用两个入口方法并使用内部方法处理调用。请参见示例 1。

      2. 使用包罗万象的消息输入/输出合同并手动路由服务调用。请参见示例 2。

    样本 1

        [OperationContract]
        [WebGet(UriTemplate = "/")]
        Years GetYears();
    
        [OperationContract]
        [WebGet(UriTemplate = "/json/", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        Years GetJsonYears();
    
        Years GetYearsInternal();
    

    样本 2

        [OperationContract]
        [WebGet(UriTemplate = "*")]
        Message Get();
    

    【讨论】:

      【解决方案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 服务的 WebServiceHostFactory 派生自定义 WebServiceHostFactoryWithJSONPSupport,并将必要的扩展(如服务行为等)添加到您的主机厂。该类不是密封的,因此应该足够简单(至少在理论上:-))。

      【讨论】:

      • 我想我会求助于自定义 serviceHostFactory。这似乎很容易。
      【解决方案3】:

      只是为了让您知道 WCF 数据服务(前 Astoria)直接支持 OData 和 JSON。

      无需任何编码。在 VS 2010 中,您只需:

      1. 创建 ADO.NET 实体模型
      2. 创建新的 WCF 数据服务

      这会自动创建一个基于提供的配置发出 JSON 或 Atom 的 REST-ful Web 服务。默认为 ATOM,要获取 JSON 格式的数据,您必须在客户端“Accept”标头中指定“application/json”。

      要制作 JSONP,需要做一些工作,请查看此链接: Link 1

      【讨论】:

        猜你喜欢
        • 2023-03-24
        • 2011-06-09
        • 2011-04-15
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多