代码之家  ›  专栏  ›  技术社区  ›  FlySwat

使用工厂和jsonp的无配置wcf

  •  1
  • FlySwat  · 技术社区  · 16 年前

    我在wcf服务中使用webserviceostfactory,以避免在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,而无需借助大量的自定义绑定配置。

    所以,对于那些完成了这项工作的人来说,有没有可能拥有一个restful wcf服务,它根据uritemplate以xml/json/jsonp响应,而不需要借助大量的配置连接呢?

    3 回复  |  直到 16 年前
        1
  •  2
  •   marc_s MisterSmith    16 年前

    我认为通过在服务合同中使用具有不同响应格式的不同方法,您应该能够非常容易地做到这一点:

    interface IYourService
    {
         [OperationContract]
         [WebGet(UriTemplate="/YourMethod/XML", ResponseFormat=WebMessageFormat.Xml)]
         SomeReturnObject YourMethodAsXml(.....);
    
         [OperationContract]
         [WebGet(UriTemplate="/YourMethod/JSON", ResponseFormat=WebMessageFormat.Json)]
         SomeReturnObject YourMethodAsJson(.....);
    }
    

    然后两种方法都可以调用一个共同的核心函数来进行数据的实际计算/查找或者你正在做的任何事情。

    我要说的是,这不需要大的配置战……它至少可以解决三个问题中的两个(xml和json)。

    jsonp在wcf中本机不受支持,但是正如您引用的文章所示,您可以相当容易地添加此行为。不过,这确实需要一些配置连接来启用这个wcf扩展。但就我所见,在你的服务器上应该是一次性的。

    如果您真的不能处理这个配置设置,当然可以派生一个自定义 WebServiceHostFactoryWithJSONPSupport WebServiceHostFactory 用于wcf rest服务,并将必要的扩展(如服务行为等)添加到主机工厂。类没有被密封,因此应该足够简单(至少在理论上是这样的:-)。

        2
  •  3
  •   bendewey    16 年前
    1. jsonp仅通过自定义绑定pre-net4可用。使用.NET4,他们在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. 使用两个entry方法并使用内部方法处理调用。见样本1。

      2. 使用catch all消息输入/输出协定并手动路由服务调用。见样本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();
    
        3
  •  0
  •   Bill the Lizard    13 年前

    只是让您知道wcf数据服务(前astoria)支持directly odata和json。

    不需要任何编码。在vs 2010中,您只需:

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

    这将自动创建一个rest-ful web服务,该服务基于所提供的配置发出json或atom。默认值是atom,要获取json格式的数据,必须在客户机的“accept”头中指定“application/json”。

    要制作jsonp,需要做一些工作,请检查以下链接: Link 1

    推荐文章