博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用网站作为WCF服务宿主的几种做法
阅读量:6940 次
发布时间:2019-06-27

本文共 3307 字,大约阅读时间需要 11 分钟。

内容摘要

这一篇文章探讨使用网站作为WCF服务宿主的几种做法,我将从最基本的svc文件的方式,演化成为无svc文件的方式,并且在最后介绍REST与路由规则结合的做法。

本文所讲解的WCF功能,是基于WCF 4.0这个版本。我所采用的开发工具是Visual Studio 2012. 本文范例代码可以通过   下载。

本文不是WCF的入门文档,有关WCF的典型使用场景和一些基础知识,可以参考我之前的两篇文章

 

范例说明

本文所采用的范例是相当简单的,我已经定义的合约和服务如下

using System.ServiceModel;namespace Web{    [ServiceContract]    public interface IHelloService    {        [OperationContract]        string SayHello();    }    public class HelloService : IHelloService    {        public string SayHello()        {            return "Hello,world";        }    }}

 

基本做法(采用svc文件的方式)

WCF 4.0以前的版本,我们都是采用svc文件作为服务的宿主文件。例如,我们可以定义如下这样一个HelloService.svc,其内容如下

<%@ ServiceHost Service="Web.HelloService" %>

 

需要注意的是,你在Visual Studio中无法直接添加一个空白的svc文件,我一般是选择Text File这个模板,但是在命名的时候,将其修改为svc后缀。如下图所示

 

定义好这个文件后,可以直接在浏览器中查看该服务的描述,如下图所示。此时表示该服务已经被正确地宿主了。

 

 

无svc文件的做法

上面这个做法虽然不难,但每次都要手工创建那个svc文件,总是觉得有些多余。那么是否有办法免去这个步骤呢?WCF 4.0提供了这种可能性。

我们需要做的是,在配置文件中指定一个虚拟的文件路径,并且将其与服务进行关联起来。如下所示(请重点关心粗体部分)

为了与上面的例子区分,我特意在这里定义relativeAddress的时候,用了不一样的名称。你没有看错,只需要这样定义就可以直接访问到MyService.svc,而不要求你实际去创建这个文件。

看起来挺不错的,但仍然有一点点美中不足就是,这个虚拟地址,必须有一个后缀名(而且推荐使用svc),对于一般的用户而言,可能并不是特别友好。是否有办法将这个地址进一步地简化呢?

对于标准的SOAP服务来说,应该是没有办法了。但是如果是REST服务,倒是有另外一个方法来实现。请继续阅读下面的说明。

 

REST与路由规则

为了做演示,我将服务稍作修改,使得其成为所谓的RESTful的服务。请注意红色粗体部分。

using System.ServiceModel;using System.ServiceModel.Web;namespace Web{    [ServiceContract]    public interface IHelloService    {        [OperationContract]          string SayHello();    }    public class HelloService : IHelloService    {        public string SayHello()        {            return "Hello,world";        }    }}

 

然后我们还需要添加有关的配置文件设置(请注意粗体部分)

 

为了使用我们自己想要的地址(虚拟地址)来访问这个服务,我们可以结合路由规则来实现(这个也是WCF 4.0新增的特性)

将如下代码添加到Global.asax文件中

using System;using System.ServiceModel.Activation;using System.Web.Routing;namespace Web{    public class Global : System.Web.HttpApplication    {        private void RegisterRoutes()        {            WebServiceHostFactory factory = new WebServiceHostFactory();            RouteTable.Routes.Add(new ServiceRoute("HelloService", factory,               typeof(HelloService)));          }        protected void Application_Start(object sender, EventArgs e)        {            RegisterRoutes();        }        protected void Session_Start(object sender, EventArgs e)        {        }        protected void Application_BeginRequest(object sender, EventArgs e)        {        }        protected void Application_AuthenticateRequest(object sender, EventArgs e)        {        }        protected void Application_Error(object sender, EventArgs e)        {        }        protected void Session_End(object sender, EventArgs e)        {        }        protected void Application_End(object sender, EventArgs e)        {        }    }}

我们在这里是定义了一个路由规则,凡是请求HelloService这个虚拟路径的(注意,没有带任何后缀),就路由到我们的服务。在浏览器中我们可以看到效果如下

转载地址:http://urnnl.baihongyu.com/

你可能感兴趣的文章
Redis开发运维实践Shell提权问题
查看>>
Copycat - StateMachine
查看>>
【软妹带你学技术】十一份Docker福利包疯狂砸来,看官们还请轻戳呦
查看>>
JTA 深度历险 - 原理与实现
查看>>
【Spark Summit EU 2016】TensorFrames: 在Spark上搭建TensorFlow深度学习框架
查看>>
RDS for MySQL 空间问题的原因和解决
查看>>
java 自适应响应式 SSM 生成静态化 手机 平板 PC 企业网站源码
查看>>
VGA练习之图像的动态显示(后续)
查看>>
开源组件photoView学习
查看>>
QT Creator 快捷键
查看>>
打开天窗说“亮话”,手淘这些年的技术大揭秘
查看>>
那些有坏味道的代码
查看>>
我们究竟什么时候可以使用Ehcache缓存
查看>>
不方便的事情,人们都不大会去做
查看>>
防火墙研究大进步,FTP服务器搭建……
查看>>
浮窗系列之越过授权使用浮窗
查看>>
aspx页面事件执行顺序(详细版)[转]
查看>>
开源项目AndroidReview学习小结(2)
查看>>
[转]Forms验证中的roles
查看>>
插图式主页
查看>>