文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Silverlight_Rest_WCF系列之五:RestInvoker的使用

Silverlight_Rest_WCF系列之五:RestInvoker的使用

时间:2011-05-15  来源:LoveJenny

在上篇文章中我们封装了Rest请求,下面我将做一些demo给大家演示RestInvoker怎么使用。

首先是服务契约代码:

这里注意下CreateByIdAndName方法,因为有两个参数,所以bodyStyle选择wrappedRequest.也就是对Request进行Wrapped的意思。

Wrapped的效果就是Json的格式会不一致。

View Code [ServiceContract]
    [ServiceKnownType(typeof(Product))]
    public interface IRestService
    {
        [OperationContract]
        [WebGet(UriTemplate = "Products", BodyStyle = WebMessageBodyStyle.Bare,ResponseFormat=WebMessageFormat.Json)]
        List<Product> Query();

        [OperationContract]
        [WebInvoke(UriTemplate = "Products", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
        Product Create(Product product);

        [OperationContract]
        [WebInvoke(UriTemplate="ProductsByIdAndName",Method="POST",BodyStyle=WebMessageBodyStyle.WrappedRequest, ResponseFormat=WebMessageFormat.Json)]
        Product CreateByIdAndName(Guid id, string name);

        [OperationContract]
        [WebInvoke(UriTemplate = "Products", Method = "PUT")]
        Product Update(Product product);

        [OperationContract]
        [WebInvoke(UriTemplate = "Products", Method = "DELETE")]
        Product Delete(Product product);
    }

服务类:

 

View Code public class RestService : IRestService
    {
        public List<Product> Query()
        {
            return SampleData.Datas;
        }

        public Product Create(Product product)
        {
            return new Product() { ID = product.ID, Name = product.Name + "PostServer" };
        }

        public Product CreateByIdAndName(Guid id, string name)
        {
            return new Product() { ID = id, Name = name + "CreateByIdAndName" };
        }

        public Product Update(Product product)
        {
            return new Product() { ID = product.ID, Name = product.Name + "PutServer" };
        }

        public Product Delete(Product product)
        {
            return new Product() { ID = product.ID, Name = product.Name + "DeleteServer" };
        }
    }

1:调用Get,Get对应的是Query方法。

具体代码如下:

RestInvoker.InvokeGet<Product[]>("http://localhost:18677/RestService.svc/Products",
                (datas) =>
                {
                    this.Dispatcher.BeginInvoke(() => {
                        MessageBox.Show(datas[0].Name);
                    });
                });

2:调用Post,Post

Product product = new Product() { ID = Guid.NewGuid(), Name = "555" };
            RestInvoker.InvokePost<Product, Product>("http://localhost:18677/RestService.svc/Products",
                product, (resultProduct) =>
                {
                    this.Dispatcher.BeginInvoke(() =>
                    {
                        MessageBox.Show(resultProduct.Name);
                    });
                });

3:调用Post方法,对应的方法是:

public Product CreateByIdAndName(Guid id, string name)
        {
            return new Product() { ID = id, Name = name + "CreateByIdAndName" };
        }

因为RestInvoker支持匿名类和JsonObject,所以可以像这样的调用服务。

var data = new { id = Guid.NewGuid(), name = "testIdName" };
            //JsonObject jo = new JsonObject();
            //jo["id"] = Guid.NewGuid();
            //jo["name"] = "testIdName";

            RestInvoker.InvokePost("http://localhost:18677/RestService.svc/ProductsByIdAndName",data
                , new Action<string>((result) => 
                {
                    this.Dispatcher.BeginInvoke(() =>
                    {
                        MessageBox.Show(result);
                    });
                }));

调用Put和Delete的方法和Post一致,区别是InvokePut,InvokeDelete.

 

这里大家可以看到因为不支持跨线程,所以我们调用了this.Dispatcher.BeginInvoke.

虽然解决了问题,但是很不优雅,下篇文章就会完善RestInvoker.让它支持跨线程访问。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载