WCF REST寄宿IIS(没有成功)

http://blog.sina.com.cn/s/blog_45a6559d0101j19a.html

http://www.myexception.cn/web-service/184939.html (这种方法service contract只能有一个,不能多接口,多个interface,可以多个单独service contract)例子见文件

使用WCF 4.0 构建 REST Service 

 

用过一段时间的Ruby on Rails,感觉它内置的RESTful结构非常的完美,也对.NET WCF 3实现REST颇有微议,今天在.NET 4.0下试了新的WCF 4,发现其重写了对REST的支持,使用了类似MVC Routing来配置URL导向,非常迷人。

下面来看下如何一步一步来创建新的REST结构的WCF项目。

 

创建项目

 1 打开VS 2010,选择新建项目,我们选择已有的模板来方便创建新的项目,在左侧Online Templates中选择WCF REST Service Template 40(CS)。

clip_image002

接下来去安装这个模板到本地,第一次安装时需要同意该使用协议,点击“安装”:

clip_image003

这样我们就很简单的用这个模板生成了一个新的项目。

 

改变之处

该模板使用了一种新的结构来创建简单的REST Service,在细读代码前,先看下项目的文件结构:

clip_image005

相对于之前的版本

l 项目中不再有SVC文件,这样就不能每次都通过xx.svc/users/1 来访问,而是通过URL Routing来配置。

l 也不再有接口文件作契约。

 

Global.asax配置

可以看到在.NET 4中构建REST服务相当容易。项目通过在Global.asax中来配置类似于ASP.NET 中的Routing进行URL重定向。见如下代码。

复制代码
 1 public class Global : HttpApplication
 2 {
 3     void Application_Start(object sender, EventArgs e)
 4     {
 5         RegisterRoutes();
 6     }
 7 
 8     private void RegisterRoutes()
 9     {
10         // Edit the base address of Service1 by replacing the "Service1" string below
11         RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)));
12     }
13 }
复制代码

 

通过代码我们可以看到,通过ServiceRoute类来进行URL重定向的,这里我们配置了一个名为Service1的Resource,指定到Service1类上。 

 

Web.config

同时,在web.config中包含着部署所需要的一些配置。下面的代码是默认生成的。

 

复制代码
 1 <?xml version="1.0"?>
 2 <configuration>
 3   <system.web>
 4     <compilation debug="true" targetFramework="4.0" />
 5   </system.web>
 6 
 7   <system.webServer>
 8     <modules runAllManagedModulesForAllRequests="true">
 9       <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
10     </modules>
11   </system.webServer>
12 
13   <system.serviceModel>
14     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
15     <standardEndpoints>
16       <webHttpEndpoint>
17         <!-- 
18             Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
19             via the attributes on the <standardEndpoint> element below
20         -->
21         <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
22       </webHttpEndpoint>
23     </standardEndpoints>
24   </system.serviceModel>
25 </configuration>
复制代码

 

Resource代码

默认生成的Resource:Service1代码,可以看到这是一个完整RESTful的结构,有着Get, Put, Post, Delete的完整支持。

 

复制代码
 1 [ServiceContract]
 2 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
 3 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
 4 public class Service1
 5 {
 6     // GET /Service1/
 7     [WebGet(UriTemplate = "")]
 8     public List<SampleItem> GetCollection()
 9     {
10         return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } };
11     }
12 
13     //  POST /Service1/
14     [WebInvoke(UriTemplate = "", Method = "POST")]
15     public SampleItem Create(SampleItem instance)
16     {
17         throw new NotImplementedException();
18     }
19 
20     // GET /Service1/100
21     [WebGet(UriTemplate = "{id}")]
22     public string Get(string id)
23     {
24         return "welcome";
25     }
26 
27     // PUT /Service1/100
28     [WebInvoke(UriTemplate = "{id}", Method = "PUT")]
29     public SampleItem Update(string id, SampleItem instance)
30     {
31         throw new NotImplementedException();
32     }
33 
34     // DELETE /Service1/100
35     [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
36     public void Delete(string id)
37     {
38         // TODO: Remove the instance of SampleItem with the given id from the collection
39         throw new NotImplementedException();
40     }
41 }
复制代码

 

 

运行测试

为了测试,将Get(string id)进行修改。可以直接运行项目(F5)。

在地址栏中加上Service1,可以看到打开一个空白页面,此时内容已经生成,只是XML数默认不直接显示在页面上。

clip_image007

通过查看其Source,可以看到返回的数据集。

clip_image008

 

 

此时参数为空,也就是会调用下面一个返回集合的方法:

1 [WebGet(UriTemplate = "")] 
2 public List<SampleItem> GetCollection()

 

 

同时,也可以发起带参数的GET请求,如/Service1/1/,则会调用相对应的参数函数:

1 [WebGet(UriTemplate = "{id}")] 
2 public string Get(string id)

 

Help 页面

模板同时也为我们生成了一个帮助页面,帮助我们快速了解该Resource所对应的URI祥情。

clip_image010

 

clip_image012

 

 

布署到IIS 7

该项目的布署和普通ASP.NET项目相同,这里写下方法。

 

将项目发布到本地磁盘:

clip_image013

 

 

 

在IIS中新建一个Site,在右侧Action下有一个Add Web Site。也可以在Default Web Site下新建一个Application,方式相同:

clip_image015

 

 

 

这一步一定要选Application pool为 ASP.NET v4.0,端口任意指定,这里使用8080

clip_image016

 

 

 

再强调一次,一定要选ASP.NET v4.0

clip_image017

 

 

 

在浏览器中打开可以看到结果。

clip_image019

关于WCF Rest服务发布到IIS会遇到的问题(转载)

 (2013-06-25 18:58:59)
最近想研究将WCF作为移动应用的服务端,刚好看到实现REST Serivce
1.WCF REST服务项目的创建:
http://www.cnblogs.com/lanvige/archive/2011/05/19/1895654.html
2.WCF REST服务项目发布到IIS上,网上资料基本没提到这个问题(都认为IIS没安装ASP.NET 4.0,应用程序池没设ASP.NET 4.0),我试了全都不行
最后发现项目模板有点问题,打开web.config,加个设置
multipleSiteBindingsEnabled="true"/>

发布与一般的“WCF应用程序”发布到IIS,没有什么区别!

3.服务扩展,如果有多个Service,增加类,例如Service2
并在Global.asax中作如下改动:
RouteTable.Routes.Add(new ServiceRoute("Service2", new WebServiceHostFactory(), typeof(Service2)));}
这里的路由原则类似于ASP.NET MVC原则(很明显,使用了相同的UrlRoute组件)
表示http://localhost:8322/WcfRest/Service2,则调用Serive2类中有如下定义的方法:

[WebGet(UriTemplate = "")]

4. IIS测试成功,如要查看各服务帮助,使用类似URI:

http://localhost:8322/WcfRest/Service2/help

VS.NET自带的Development Server与真实的IIS区别还是比较大的,以后尽量用IIS测试!下一步研究将实现它的HTTPS发布,并实现自定义用户名和密码验证

5. jQuery调用WCF REST Service示例(测试时,发现Call基地址时,最好加上"/")

jQuery调用WCF REST示例(本域内)

6.发布在IIS上,意外发现PUT和DELETE操作受限,返回405操作,最后找到的解决方案,在网站web.config中,





7.WCF的身份验证

采用了ASP.NET 原有的Forms身份验证,对

基本思路,在WCF REST Service中实现一个LoginService,以Post方式提交用户名和密码, 这里遇到第1个问题,如何传递多个参数,当然可以用URL传,但没人想看到用户名和密码暴露,查资料,发现了窍门:

[WebInvoke(UriTemplate = "", Method = "POST",BodyStyle=WebMessageBodyStyle.WrappedRequest)]

public bool Login(string userName, string userPassword)

基本思想就是通过了验证,则手工作一个Cookie返回去(加密了的),以后要请求网站资源,必须把Cookie带回来作验证,REST是以标准的HTTP协议实现,所以这点很容易。

Forms身份验证很容易配置,除了LoginService可以匿名访问,其它的一概不允许,当访问受限时,自动以GET方式访问LoginService,得到的提示是:非法用户。

后面我们用控制台以标准的HTTP方式访问,得到了正常的数据。

8.发布在IIS上,并以SSL加以保护,这是折腾我最久的:

要想SSL正常,有几个要点特别注意:

(1)Web.Config的配置

(2)服务器配置,防火墙高级设置,入站规则要加上433端口(可以在80后加,80,433)

测试正常,很完美,以下是测试代码: REST服务及调用

posted on 2016-08-18 10:37  oyl  阅读(340)  评论(0编辑  收藏  举报

导航