用asp.net做的购物网站,网页策划案,健康中国app,热铁盒网页托管本文主要来自MSDN杂志《Building Cross-Platform Web Services with ServiceStack》#xff0c;Windows Communication Foundation (WCF) 是一个相当优秀的服务框架#xff0c;当我们讨论跨平台的服务的时候#xff0c;虽然WCF对WebService的支持还行#xff0c;在面对一些…本文主要来自MSDN杂志《Building Cross-Platform Web Services with ServiceStack》Windows Communication Foundation (WCF) 是一个相当优秀的服务框架当我们讨论跨平台的服务的时候虽然WCF对WebService的支持还行在面对一些高级应用的不太好微软重新发展了ASP.NET WebAPI框架关于这两个框架的讨论可以看我另外一篇文章《WCF和ASP.NET Web API在应用上的选择》 。在讨论跨平台的Web服务上ASP.NET Web API是一个重要选项在本文中我将展示如何利用 ServiceStack 开放源代码.NET 和Mono REST 服务框架 来完成这一任务不用离开 Visual Studio 或 Microsoft.NET/Mono除了 ServiceStack 之外还有个Nancy的框架具体可以看《.NET的微型Web框架 Nancy》。 一个典型的 Web 服务结构如下 服务层是您定义您的Web 服务接口的地方。 这也是客户端和你的 Web 服务进行交互的一层。业务层通常是业务逻辑数据层是为了封装数据访问和操纵在业务层提供抽象的数据模型。Web服务通常有远程过程调用RPC)和RESTful HTTP两类现在占据主导地位的Web服务是RESTful HTTP具体内容可以参看文章《REST在企业中获得成功了么》,贴一张文章里的图片 2年前REST就已经成为Web API部署方式的主流了而且一直保持这种发展势头现在基本上都是REST服务SOAP在企业内网还存在。 远程过程调用 (RPC) 每个请求旨在类似于函数调用 public interface IService { string DoSomething(int input); } RPC 方法对服务的修改非常不友好。 例如前面的代码段如果要求从客户端来执行更高版本的 Web 服务的 DoSomething 方法的两个输入参数 — 或需要返回字符串值之外的另一个字段 —— 给老客户重大更改是不可避免的。 当然您始终可以创建平行的 DoSomething_v2 方法要带两个输入的参数但久而久之会搞乱您的 Web 服务接口和消费者服务变得越来越丑用WCF实现的Web服务就是属于这种情况下面我们介绍ServiceStack。 ServiceStack是.Net和Mono的开源框架相对WCFMVC及Web API而言它是开发Web服务与Web应用的有力替代品它越来越普及。 用 ServiceStack 生成的 web 服务可以运行在 Windows 环境中.NET 代码或Mono支持 Linux 环境中。 Mono支持的操作系统包括 LinuxMac OS X, iOSSun SolarisBSDMicrosoft WindowsNintendo WiiSony PlayStation 3ServiceStack是一系列事物的综合体 包含高性能Razor Engine的Web应用框架支持例如HTMLXMLJSONSOAP等多种格式的基于消息的Web服务框架包含内建IOC的容器若干内建库文件诸如Text serializerRedis ClientORM以及caching providers除了ASP.NET Hosting和Mono Hosting之外还包含self-hosting选项ServiceStack 强制远程 Web 服务最佳实践、 基于公约 DTO 标准为其 Web 服务接口ServiceStack 还提供预置的响应状态对象可用于撰写 DTO鼓励更加直接和简单的错误处理方案显然和WCF是明显不同的路线。 本文假定您有一些熟悉 WCF 和.NET 框架。 为了更好地展示WCF 概念可以如何转化为 ServiceStack 的概念首先会在WCF中实现服务层。我会告诉你如何通过将WCF Web 服务移植到等效的使用 ServiceStack 转换为跨平台的 Web 服务。 WCF 使用数据合同建立的客户端和服务器之间的通信手段。 ServiceStack和WCF相同。 WCF 需要何数据对象和数据成员打上标记 否则WCF 简单地忽略它们。 这是 ServiceStack 和 WCF 与的不同的地方。 ServiceStack 支持所有POCO 的对象作为契约 WCF的契约 [DataContract] public class Ticket { [DataMember] public int TicketId { get; set; } [DataMember] public int TableNumber { get; set; } [DataMember] public int ServerId { get; set; } [DataMember] public ListOrder Orders { get; set; } [DataMember] public DateTime Timestamp { get; set; } } [ServiceContract] public interface ITicketService { /// summary /// 检索当前队列中的所有门票的完整清单 /// /summary /// returns/returns [OperationContract] ListTicket GetAllTicketsInQueue(); /// summary /// 新增新门票 /// /summary /// param nameticket/param [OperationContract] void QueueTicket(Ticket ticket); /// summary /// 从队列拉出一张票 /// /summary /// returns/returns [OperationContract] Ticket PullTicket(); } } 把它转换为ServiceStack的契约 public class Ticket { public int TicketId { get; set; } public int TableNumber { get; set; } public int ServerId { get; set; } public ListOrder Orders { get; set; } public DateTime Timestamp { get; set; } } public class GetAllTicketsInQueueRequest { } public class QueueTicketRequest { public Ticket Ticket { get; set; } } public class PullTicketRequest { } public interface ISCTicketService { ListTicket Any(GetAllTicketsInQueueRequest request); void Any(QueueTicketRequest request); Ticket Any(PullTicketRequest request); } ServiceStack 规定每个唯一的请求是对象所标识唯一的请求这意味着你不能重用 DTO 跨多个服务实现与 ServiceStack 的请求。ServiceStack 支持不同的操作如有 Get 和 Post。 您的选择在这里仅影响的 HTTP 请求。 指定任何 Web 服务请求是指可以通过 HTTP GET 和 HTTP POST 调用操作。 这种强制措施简化了 rest 风格的 Web 服务实现。要将您的 ServiceStack Web 服务变成 rest 风格的 Web 服务只需添加 URL [Route(...)]向您的 Web 服务请求声明属性。 //Request DTO public class Hello { public string Name { get; set; } } //Response DTO public class HelloResponse { public string Result { get; set; } public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized } //Can be called via any endpoint or format, see: http://servicestack.net/ServiceStack.Hello/ public class HelloService : Service { public object Any(Hello request) { return new HelloResponse { Result Hello, request.Name }; } } //REST Resource DTO [Route(/todos)] [Route(/todos/{Ids})] public class Todos : IReturnListTodo { public long[] Ids { get; set; } public Todos(params long[] ids) { this.Ids ids; } } [Route(/todos, POST)] [Route(/todos/{Id}, PUT)] public class Todo : IReturnTodo { public long Id { get; set; } public string Content { get; set; } public int Order { get; set; } public bool Done { get; set; } } public class TodosService : Service { public TodoRepository Repository { get; set; } //Injected by IOC public object Get(Todos request) { return request.Ids.IsEmpty() ? Repository.GetAll() : Repository.GetByIds(request.Ids); } public object Post(Todo todo) { return Repository.Store(todo); } public object Put(Todo todo) { return Repository.Store(todo); } public void Delete(Todos request) { Repository.DeleteByIds(request.Ids); } } 以ASP.NET Hosting承载ServiceStack创建一个空的ASP.NET应用使用 NuGet 包管理器控制台将 ServiceStack 引用添加到 ServiceStack.Host.AspNet中所示 Web.config 会增加下面的配置 configuration system.web compilation debugtrue targetFramework4.0 / httpHandlers add path* typeServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack verb* / /httpHandlers /system.web system.webServer modules runAllManagedModulesForAllRequeststrue / validation validateIntegratedModeConfigurationfalse / handlers add path* nameServiceStack.Factory typeServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack verb* preConditionintegratedMode resourceTypeUnspecified allowPathInfotrue / /handlers /system.webServer /configuration 你需要从 ServiceStack.WebHost.End 继承实现端点。 public class AppHost : AppHostBase { public AppHost() //Tell ServiceStack the name and where to find your web services : base(StarterTemplate ASP.NET Host, typeof(HelloService).Assembly) { } public override void Configure(Funq.Container container) { //Set JSON web services to return idiomatic JSON camelCase properties ServiceStack.Text.JsConfig.EmitCamelCaseNames true; //Configure User Defined REST Paths Routes .AddHello(/hello) .AddHello(/hello/{Name*}); //Uncomment to change the default ServiceStack configuration //SetConfig(new EndpointHostConfig { //}); //Enable Authentication //ConfigureAuth(container); //Register all your dependencies container.Register(new TodoRepository()); } /* Uncomment to enable ServiceStack Authentication and CustomUserSession private void ConfigureAuth(Funq.Container container) { var appSettings new AppSettings(); //Default route: /auth/{provider} Plugins.Add(new AuthFeature(() new CustomUserSession(), new IAuthProvider[] { new CredentialsAuthProvider(appSettings), new FacebookAuthProvider(appSettings), new TwitterAuthProvider(appSettings), new BasicAuthProvider(appSettings), })); //Default route: /register Plugins.Add(new RegistrationFeature()); //Requires ConnectionString configured in Web.Config var connectionString ConfigurationManager.ConnectionStrings[AppDb].ConnectionString; container.RegisterIDbConnectionFactory(c new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider)); container.RegisterIUserAuthRepository(c new OrmLiteAuthRepository(c.ResolveIDbConnectionFactory())); var authRepo (OrmLiteAuthRepository)container.ResolveIUserAuthRepository(); authRepo.CreateMissingTables(); } */ public static void Start() { new AppHost().Init(); } } ServiceStack Web 应用程序启动时您的服务合同列出作为元数据操作如图所示 相关文章 SignalR, Filters and ServiceStack 采访ServiceStack的项目领导Demis Bellot——第1部分 采访ServiceStack的项目领导Demis Bellot——第2部分 转载于:https://www.cnblogs.com/shanyou/p/3348347.html