当前位置:  开发笔记 > 编程语言 > 正文

WebInvoke属性是否可以由绑定配置替换

如何解决《WebInvoke属性是否可以由绑定配置替换》经验,为你挑选了1个好方法。

为了使WCF服务与JQuery一起使用,我在操作契约上添加了一个WebInvoke属性来控制JSON序列化,如下所示:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

有没有办法通过配置中的服务绑定来控制此序列化,因为它限制了此服务向不同端点提供不同的序列化.



1> Paul Keister..:

我有一个不同的解决方案,它在@Marc Gravell的另一端工作:不是复制合同,而是从服务实现中派生出两个不同的类.这些只是类型别名; 它们是必要的,因为WCF激活系统(至少在IIS上)不允许你在不同的URL上激活相同的服务类型(我不知道为什么Gravell的解决方案没有遇到这个问题 - 我的错误获取是"当我尝试在同一站点上的不同URL激活相同的服务类时,URI已存在注册...".请注意,如果你想运行痘和JSON相同的服务,这仅仅是一个问题同时.如果您只想控制响应格式,则不需要此解决方法.

我的解决方案背后的关键概念是为同一服务使用2个不同的URI,然后使用端点行为来设置默认的出站响应格式.您可以在此问题中找到更多信息,这也涉及概念纯度问题:我们是否应该使用契约属性来指定属于网络协议的属性?我认为Marc Gravell对此问题的看法本身是有效的,但它与WCF的原始概念不一致,其中合同应该从协议栈中抽象出来.但是端点行为不允许您指定所有与REST相关的属性,您必须使用URI模板和入站格式的属性.

REST可以以不同的方式实现吗?尽管WCF的设计人员在设计通用框架方面做得非常出色,但我认为他们并没有看到REST的到来.有些东西,比如URI模板,确实似乎属于合同.

够了!这是代码.首先是web.config文件.这就是魔术发生的地方.请注意,我在此示例中使用基于WCF 4配置的激活,但您也可以通过使用2个svc文件来表示2个URI来完成相同的操作.



  
    
  
  
    
      
        
      
      
        
      
    
    
      
        
          
        
        
          
        
      
    
    
      
        
        
      
    
  

这里是代码,包括服务合同,服务实现以及使其工作所需的类型别名:

namespace StackOverflow
{
    [DataContract]
    public class Quotation
    {
        [DataMember]
        public string Text { get; set; }

        [DataMember]
        public string Author { get; set; }
    }

    [ServiceContract]
    public interface IQuoteOfTheDay
    {
        [OperationContract]
        [WebInvoke(Method="GET", UriTemplate="GetTodaysQuote")]
        Quotation GetTodaysQuote();
    }

    public class QuoteOfTheDayImp : IQuoteOfTheDay
    {
        public Quotation GetTodaysQuote()
        {
            return new Quotation()
            {
                Text = "Sometimes it's better to appologize for not asking permission",
                Author = "Admiral Grace Murray Hopper"
            };
        }
    }

    /// 
    /// A type alias used for json activation
    /// 
    public class QuoteOfTheDayAsJson : QuoteOfTheDayImp 
    {}

    /// 
    /// A type alias used for pox activation
    /// 
    public class QuoteOfTheDayAsPox : QuoteOfTheDayImp
    {}
}

如果它不是类型别名的必要性,我会说这是一个完整的解决方案.如果您不想同时支持多种格式,这是一个完整的解决方案.这比多合同解决方案更优越,因为只有一个合同,您不需要保持两个合同同步.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有