Win7下使用IIS托管WCF服务
第一步,确保Win7正确安装了IIS。
操作步骤:
- 打开控制面板-程序和功能-点击左侧“打开或关闭Windows功能”,在弹出框中选中“Internet信息服务”,需要注意的是有的需要将其展开,选中相关项。
- 在浏览器中输入http://localhost,如果出现了IIS启动界面,即表示IIS安装成功。
第二步,在进行IIS托管WCF服务之前,先建立一个asp.net程序试下。
由于Win7+VS2010使用的是.Net 4.0,所以需要确保注册了asp.net 4.0。
操作步骤:
- 进入C:\Windows\System32找到cmd.exe,右键“以管理员身份运行”,然后在控制台输入:cd C:\Windows\Microsoft.NET\Framework\v4.0.30319切换到该目录
- 然后输入:aspnet_regiis.exe –i,就会看到正在注册,以及注册成功的提示信息。
备注:最好使用控制台来进行asp.net的注册,其实也可以直接以管理员身份运行aspnet_regiis.exe,但是会看不到是否成功的提示!
第三步:创建解决方案,并发布asp.net网站
操作步骤:
- 创建一个默认的asp.net网站,不用更改其中任何东西。
- 在项目上,右键“属性页”,在“启动选项”中的“特定页”和服务器,进行如下设置:
需要注意的是,这时如果你在项目上右键-在浏览器中查看,会发现不能访问。
- 鼠标右键-发布网站,出现如下图所示对话框:
点击“目标位置”进入如图对话框:
选择“文件系统”,即表示你要将你的网站发布到的本地计算机的位置,在第四步建立网站的时候会引用。
备注:由于,我们没有修改代码,应该发布会很顺利。
第四步:建立站点。
操作步骤:
- 控制面板-管理工具-Internet信息服务(IIS)管理器,双击进入。或者,从桌面的计算机/我的电脑-鼠标右键“管理”-展开“服务和应用程序”-选择“Internet信息服务(IIS)管理器”也看进入。
- 在左侧,应用程序池,点击可以看到右侧详细的右侧应用程序池列表,右击空白处“设置应用程序池默认设置”-第一项“.NET Framework版本”,选择v4.0。
- 右键左侧“网站”-选择“添加网站”,输入“网站名称”,物理路径中引用第三步发布网站的目录,IP地址输入127.0.0.1表示本地,端口不变,主机名暂不输入,如果输入了可能不能访问。好了,点击确定就OK了。
- 接下来,做一些小的设置。首先,由于IIS 7默认使用的是VB,而我使用的是C#,所以需要设置下。点击你建立的网站,会发现左侧的一些设置选项,如下图:
具体可能,你看到的和这里不一致,有的与版本有关,还有的就是和你之前安装IIS选项有关。首先,选择双击第一个“.NET编译”,默认语言选择为:C#;接着双击选择IIS中的ASP,在行为中设置“启用父路径”为true;最后一个双击选择“目录浏览”,最右侧选择“启动”。
5.回到你站点,右键“管理网站”-“浏览”,会弹出启动浏览器,如果你已经可以看到默认的asp.net网站,那就表示已经OK了。
由于,有的操作步骤可能不是按照我上面的来的,可能会出现下面的错误信息:
找不到“ManagedPipelineHandler”模块的错误信息,那就是因为没有注册asp.net4.0的缘故,返回执行第二步。
注意:在第四步的时候,我们并没有建立域名绑定,如果设置了主机名,我们需要在C:\Windows\System32\drivers\etc中的hosts文件中添加一行:
127.0.0.1 主机名
这样,你就可以通过域名访问你的站点了。
第五步:建立WCF服务,托管到IIS。
这里,我使用WCF服务库+WCF服务应用程序+启用了AJAX的WCF服务。
- 创建WCF服务库,在解决方案中新添加一个“新建项目”,选择WCF中的“WCF服务库”向其中添加服务。
- 创建WCF服务应用程序,在解决方案中再添加一个“新建项目”,选择WCF中的“WCF服务应用程序”,想其中添加对WCF服务库的引用,即右键-“添加引用”-选择“项目”。接下来修改*.svc文件,删除其中不必要的东西,修改如下:
<%@ ServiceHost Language="C#" Debug="true" Service="*.*Service"%>
其中关键的地方时Service属性,是对之前WCF服务库的引用。
- 在WCF服务应用程序中创建启用了AJAX的WCF服务的项目,添加这个项目的目的是解决跨域的问题。对于这个文件有几点需要注意,这里主要针对配置文件进行说明:
a) 允许客户端脚本的运行:
<behaviors>
<endpointBehaviors>
<behavior name="behavior1">
<webHttp />
</behavior>
<behavior name="behavior2">
<enableWebScript /><!--//注意这里à
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
b) 绑定,允许跨域访问:
<bindings>
<webHttpBinding>
<binding name="bind1" crossDomainScriptAccessEnabled="true"/><!--//允许跨域访问à
</webHttpBinding>
</bindings>
c) 对服务应用地址,绑定,行为,契约进行设定:
<service name="servicename">
<endpoint address="" behaviorConfiguration="behavior2"<!—上面行为的设置名称à
bindingConfiguration="bind1"<!—上面绑定设置的名称à
binding="webHttpBinding" contract="*.*Service" <!—与WCF服务库对应à/>
</service>
在这里,有必要说明一些问题:
首先,启用了AJAX的WCF服务不是必须的,假如你没有使用跨域,或者你使用的不是纯粹的html页面通过js访问,你都可以不考虑通过这个服务来调用WCF服务。
然后是,我们没有必要将启用了AJAX的WCF服务和WCF服务应用放在一起,完全可以将其二者独立,减少二者的耦合度。我们可以使用svcutil.exe工具来实现。我们会在稍后回过头来对此详细说明。
d) 对服务应用地址,绑定,行为,契约进行设定:
第六步:调用托管到IIS的WCF服务。
这里,我们以一个ASP.NET空WEB应用来说明,目的是想通过纯粹的html页面实现WCF服务。
1.准备工作,创建一个静态html页面,添加jquery文件,这里由于针对的是跨域访问,所以我们使用getJSON方法。