还在为数据跨国传输发愁?WCF中XML和JSON格式转换的两种神技让你轻松搞定

开发 Web 服务期间,存在权限配置不恰当这种情况,通常就会致使服务没办法启动。并且,服务协定所体现的设计这些细节,其状况直接就会对客户端的调用体验产生效应。

    public sealed class Book
    {
        public string BookName { get; set; }
        public decimal Price { get; set; }
        public string BarCode { get; set; }
    }

WebServiceHost类的使用限制

    [ServiceContract]
    interface IService
    {
        [OperationContract]
        [WebGet(UriTemplate = "getdata?f={format}")]
        Message GetXml(string format);
    }

运用WebServiceHost类能够使HTTP通信配置得以简化,然而务必要留意权限方面的问题。于Windows系统里,要是打算以并非80的端口来实施HTTP监听,那么便需要具备管理员权限。不然的话,系统将会拒绝访问,进而致使服务启动遭遇失败。

开发者为要防止权限问题,就能够选用利用80端口,或者经由系统配置赋予当前用户权限。还有一种做法则是于启动时申办提升权限,然而这会对用户体验造成影响。在实际开展部署的时候,提议采用IIS当作宿主,如此便能规避权限限制。

服务协定的定义规范

若要定义服务协定,就得用ServiceContract特性去标记接口。要是没指定Name属性,那系统就会默认拿接口名称当作协定名称。此名称在客户端与服务端的通信里起着关键作用。

    public class MyService : IService
    {
        public Message GetXml(string format)
        {
 WebOperationContext context = WebOperationContext.Current;
 Book b = new Book
 {
 BookName = "卖女孩的小火柴",
 Price = 25.2M,
 BarCode = "2811365801"
 };
 Message msgreturn = null;
 // 判断格式
 if (format.ToLower == "xml")
 {
 msgreturn = context.CreateXmlResponse(b);
 }
 else
 {
 msgreturn = context.CreateJsonResponse(b);
 }
 return msgreturn;
        }
    }

协定里的每一个方法,都得明确标记OperationContract特性,不然客户端就没办法调用。此特性能够配置名称、回复动作等参数。合理设置这一些参数,能够对服务的行为予以优化。

服务协定的兼容性

服务协定于服务端及客户端能够运用各异的接口予以定义,只要协定之名相同,且方法的参数以及返回值相互匹配便可。这般灵活性致使双方能够独立进行演进,只要维持契约恒定。

于实际开发期间,提议运用共享的协定程序集,或者借助工具去生成客户端代理,如此能够降低不匹配之灾险。要是的确有必要进行独立定义,那就得确证数据类型以及成员顺序全然相同。

灵活的数据格式返回

利用Message类型产生的返回值呀,能够达成多种数据格式的返回效果呢。于方法内部哟,借助参数能使调用者去指定所需的格式呀,像xml或者json之类的呢。如此这般既满足了不同客户端的需求啦,又维持了接口的统一哟。

  
    
      
        
 
 
 
        
      
    
  

于实现之际呢,可以借助WebOperationContext.Current去获取当下的上下文,接着依据格式参数来调用各异的创建响应办法。此种办法虽说拥有灵活性,然而却需要手动去处理序列化方面的逻辑。

        static void Main(string[] args)
        {
 WebServiceHost host = new WebServiceHost(typeof(MyService));
 host.Open;
 Console.WriteLine("服务已打开。");
 Console.Read;
 host.Close;
        }

WebOperationContext的应用

WebOperationContext类给出了多个CreateXXXResponse办法,是用来创建不一样类型的响应的,像CreateJsonResponse是应对JSON格式的,CreateXmlResponse是针对XML格式的,这些办法会自行处理序列化进程。

当运用这些方法之时,仅需把数据对象传送给泛型方法就行。系统会依据所指定的类型参数达成序列化。此种方式相较于手动序列化更为简洁,并且降低了出现错误的可能性。

WCF ServiceHost WebHttpBinding JSON序列化_WCF WebServiceHost XML JSON格式返回_XML

服务配置的注意事项

硬编码的方式能够在代码里实现服务基址,配置文件指定的办法也可行。借助配置文件拥有的优势是,在不进行重新编译时,就能够对地址予以修改。这对于不同环境下的部署而言,具备相当有用的性质。

    [DataContract(Namespace = "http://sample",Name = "student")]
    public sealed class Student
    {
        [DataMember(Name = "stu_id")]
        public int StuID { get; set; }
        [DataMember(Name = "stu_name")]
        public string StuName { get; set; }
    }

运用ServiceHost之际,要对WebHttpBinding以及WebHttpBehavior予以配置。把automaticFormatSelectionEnabled设定成true能够自动处置格式选择,并且会将字符串响应外层的引号去除掉,从而让数据更加整洁。

曾在开发Web服务之际遭遇到哪些权限或者配置层面的此类问题呢,欢迎于评论区域分享相关经验哟,要是觉得这篇文章具备用处的话,请予以点赞给予支持呀!

    [ServiceContract]
    public interface IData
    {
        [OperationContract]
        [WebGet(UriTemplate = "getdata?f={format}")]
        string GetData(string format);
    }

发表评论