您的位置:首页 > 其它

WCF系列之.net(3.0/3.5)Rest使用示例

2013-02-25 13:18 453 查看
上面我介绍了在.NET(3.0/3.5)开发WCF的使用示例。

这篇,我将讲解Rest 这个炙手可热的新的开发方式,至于rest 是什么,请大家百度下。

我们还是以下面的方式做示例:

服务接口-》服务-》客户端

1.服务接口:数据接口

using System.ServiceModel;
using System.ServiceModel.Web; //这里就是REST 要关键引用的类
using System.Runtime.Serialization;
namespace Wcf.IProductService
{
[ServiceContract]
public interface IProduct
{
//REST 四个 GET POST PUT DELETE
[OperationContract] //注意.NET3.5必须要带这个 4.0 开始就可以取消了
[WebGet(UriTemplate = "all", ResponseFormat = WebMessageFormat.Xml)]
List<Product> GetAll();
/*IEnumerable<Product> GetAll();
在.NET3.5不可以 4.0就可以 很郁闷 找了2天 问题依旧
后来把 IEnumerable改成List 问题解决
原因.NET4.0 对IEnumerable增加了新特性
*/

[OperationContract]
[WebGet(UriTemplate = "{id}")]
Product Get(string id);

//添加 其中路径为/
[OperationContract]
[WebInvoke(UriTemplate = "/", Method = "POST")]
void Create(Product product);

//更新
[OperationContract]
[WebInvoke(UriTemplate = "/", Method = "PUT")]
void Update(Product product);

//删除
[OperationContract]
[WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
void Delete(string id);

}
}


数据成员:

using System.Runtime.Serialization; //序列化
namespace Wcf.IProductService
{
[DataContract(Namespace = "http://yuhao.com")]
public class Product
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string ProductName { get; set; }
[DataMember]
public string Price { get; set; }
}
}


2.服务:config配置

<system.serviceModel>
<!--注意这里传统的WCF区别-->
<services>

<service name="Server.ProductService"> <!--这里只有服务名称 没有行为-->
<endpoint address="http://127.0.0.1:1808/ProductService"
binding="webHttpBinding"
contract="Wcf.IProductService.IProduct" />
<!--Address(地址) 提高访问地址 可以自己设置-->
<!--Binding(绑定) 提供访问的模式 -->
<!--Contract(契约) 表示的是提高的接口 带命名空间-->
<!--大家看到了没有 多简单没有 那个复杂的元数据-->
</service>
</services>

</system.serviceModel>


实现服务类

using Wcf.IProductService;
using System.ServiceModel.Web;
namespace Server
{
public class ProductService:IProduct
{
public static List<Product> products = new List<Product>()
{
new Product{Id="1",ProductName="Iphone4s",Price="3788"},
new Product{Id="2",ProductName="Ipad3",Price="3288"}
};

#region IProduct 成员
//public IEnumerable<Product> GetAll() .net 3.5 不支持 害我调试半天
public List<Product> GetAll()
{
return products;
}

public Product Get(string id)
{
Product product = products.FirstOrDefault(p => p.Id == id);
if (null == product)
{
return null;
}
return product;
}

public void Create(Product product)
{
products.Add(product);
}

public void Update(Product product)
{
this.Delete(product.Id);
products.Add(product);
}

public void Delete(string id)
{
Product product = this.Get(id);
if (null != product)
{
products.Remove(product);
}
}

#endregion
}
}


开启服务类 :

using System.ServiceModel;
using System.ServiceModel.Web;//这个类是关键
using Wcf.IProductService;
namespace Server
{
class Program
{
static void Main(string[] args)
{
using (WebServiceHost host = new WebServiceHost(typeof(ProductService)))
{
host.Open();
Console.WriteLine("服务已启动");
Console.Read();
}
}
}
}


3.客户端:config配置

<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webBehavior">
<webHttp/>

</behavior>
</endpointBehaviors>

</behaviors>

<client>
<endpoint name="Server.ProductService"   address="http://127.0.0.1:1808/ProductService" behaviorConfiguration="webBehavior" binding="webHttpBinding" contract="Wcf.IProductService.IProduct"/>
</client>

</system.serviceModel>


客户端调用

ChannelFactory<IProduct> ChannelFactory = new ChannelFactory<IProduct>("Server.ProductService");

IProduct proxy = ChannelFactory.CreateChannel();

//Response.Write(proxy.Get("1").ProductName);
Array.ForEach<Product>(proxy.GetAll().ToArray(), product => Response.Write(product.ProductName));


好了,代码到此就结束了,大家发现没有这个比传统的SOAP代码省多了 而且还很简单 太棒了!
大家在开发Rest的时候,尽量多注意.net版本,我就因为一个返回数组的问题,折腾2天!

下一篇,我将讲解.net 4.0 开发WCF 的开发方式 和以往更不同哦!

示例代码:WcfDemo(.net3.5)REST.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: