Silverlight_Rest_WCF系列之三:PUT和DELETE

简介:

我们在上篇文章中讲过WebClient不支持PUT,DELETE.

那么WebRequest支持PUT和DELETE吗??

于是我们修改PUT代码为:

WebRequest webRequest  =  WebRequest.Create( " http://localhost:19598/ProductService.svc/Product " );
            webRequest.ContentType 
=   " application/json " ;
            webRequest.Method 
=   " PUT " ;

结果还是一样的错误,细心的读者如果反编译过WebClient的话,可以看到内部的实现就是:

复制代码
//  System.Net.WebClient
using  System;
protected   virtual  WebRequest GetWebRequest(Uri address)
{
    WebRequest webRequest 
=  WebRequest.Create(address);
    
this .CopyHeadersTo(webRequest);
    HttpWebRequest httpWebRequest 
=  webRequest  as  HttpWebRequest;
    。。。
    
return  webRequest;
}
复制代码

原来WebClient不支持PUT和DELETE是因为WebRequest.Create(address)返回的WebRequest不支持PUT和DELETE啊。

事到如今摆在面前有两个方案。。

1:不支持就不要用它,就简单的用GET,POST两个Method就好了,用URL来区别就可以了,比如

http://...createproduct/

http://...updateproduct/,

http://...deleteproduct/

2:试试还有没有其他的WebRequest支持PUT,DELETE,比如HttpWebRequest,。

 

当然了用1方案的没任何问题,用2方案的就要google下了。

在Silverlight中使用WebRequestCreator就可以设置PUT,DELETE了。

WebRequest webRequest  = WebRequestCreator.ClientHttp.Create(
                
new  Uri( " http://localhost:19598/ProductService.svc/Product " ));

于是将PUT的代码修改为:

 

复制代码
#region  使用WebRequest

            WebRequest webRequest 
= WebRequestCreator.ClientHttp.Create(
                
new  Uri( " http://localhost:19598/ProductService.svc/Product " ));
            webRequest.ContentType 
=   " application/json " ;
            webRequest.Method 
=   " PUT " ;
            webRequest.BeginGetRequestStream(requestAsyncCallback 
=>
                {
                    Stream requestStream 
=  webRequest.EndGetRequestStream(requestAsyncCallback);

                    JsonObject jo 
=   new  JsonObject();
                    jo[
" Id " =  Guid.NewGuid().ToString();
                    jo[
" Name " =   " test " ;

                    
string  jsonString  =  jo.ToString();
                    
byte [] buffer  =  System.Text.Encoding.Unicode.GetBytes(jsonString);
                    requestStream.Write(buffer, 
0 , buffer.Length);
                    requestStream.Close();

                    webRequest.BeginGetResponse(responseAsyncCallback 
=>
                        {
                            WebResponse webResponse 
=  webRequest.EndGetResponse(responseAsyncCallback);
                            
using  (StreamReader reader  =   new  StreamReader(webResponse.GetResponseStream()))
                            {
                                
string  result  =  reader.ReadToEnd();
                                MessageBox.Show(result);
                            }
                        }, 
null );
                }, 
null );

            
#endregion
复制代码

这里还是会抛出SecurityException。主要原因是PUT和DELETE操作需要服务端授权,于是将

clientaccesspolicy.xml的代码修改为:

复制代码
<? xml version = " 1.0 "  encoding = " utf-8 " ?>
< access - policy >
  
< cross - domain - access >
    
< policy >
      
< allow - from  http - methods = " * "  http - request - headers = " * " >
        
< domain uri = " * " />
      
</ allow - from >
      
< grant - to >
        
< resource path = " / "  include - subpaths = " true " />
      
</ grant - to >
    
</ policy >
  
</ cross - domain - access >
</ access - policy >
复制代码

主要是设置<allow-from  http-methods="*" http-request-headers="*">.

ok,我们再次尝试调用PUT。

在MessageBox.Show(result);这句代码抛出异常,异常为跨线程访问无效。

在silverlight中创建UI控件的是一个线程,也叫做UI线程,

silverlight使用其他的线程异步的调用服务,然后在其他的线程中尝试调用UI线程的MessageBox.Show,

针对跨线程访问无效有两种通用的方法。

1:使用Dispatcher对象。

2:使用System.Threading.SynchronizationContext对象保存线程的同步上下文.

在这里为了方便,我就直接

this .Dispatcher.BeginInvoke(()  =>
                                {
                                    MessageBox.Show(result);
                                });

 完整源码:/Files/LoveJenny/2011-05-09/RestWCF.rar

 好了,今天就到此为止,下篇文章要封装调用Rest服务的方式,毕竟不可能每次调用服务都Copy这么多代码吧,下回分解。。






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2011/05/09/2041516.html,如需转载请自行联系原作者

目录
相关文章
|
C++
【SPSS】游程检验-变量值随机性检验和两独立样本的W-W游程检验详细操作教程(附案例实战)
【SPSS】游程检验-变量值随机性检验和两独立样本的W-W游程检验详细操作教程(附案例实战)
437 0
|
SQL 安全 算法
网络安全的盾牌与剑:漏洞防御与加密技术
【8月更文挑战第31天】 在数字化时代的浪潮中,网络安全成为维护信息资产的前沿阵地。本文将深入探讨网络安全的两大支柱——漏洞防御和加密技术,通过分析常见网络攻击手段,揭示安全漏洞的本质,并分享实用的防护策略。同时,我们将走进加密技术的神秘世界,了解其原理及应用,并通过代码示例加深理解。最后,强调培养良好的安全意识的重要性,以人为因素作为保护信息安全的关键一环。
|
Java API
探讨Java集合的组内平均值计算
探讨Java集合的组内平均值计算
172 1
阿里云个人备案网站名称填写要求
阿里云个人备案网站名称填写要求,阿里云个人网站备案对网站名称是有要求的,网站命名不能出现博客、论坛、在线、社区、交流、分享、个人空间、爱好者、博客、导航、工作室、论坛、平台、热线、社区、社团、网络、网站、网址、主页、资讯、作品展示等词汇,阿里云百科分享阿里云个人网站备案名称要求:
848 0
阿里云个人备案网站名称填写要求
|
缓存
小满Router(第九章-路由元信息)
通过路由记录的 meta 属性可以定义路由的元信息。使用路由元信息可以在路由中附加自定义的数据,
165 0
|
弹性计算 应用服务中间件 运维
阿里云服务器ECS、轻量应用服务器和云虚拟主机的区别及对比
阿里云服务器ECS、轻量应用服务器和云虚拟主机的区别及对比
|
JavaScript
分享30个最佳 jQuery Lightbox 效果插件
Lightbox 应该是最流行的图片浏览效果了,常具有功能包括:自动根据窗口的大小缩放图片,模式窗口,幻灯片方式播放,内容预加载,渐变等效果。Web开发者们模仿 Lightbox 开发了各种各样的图片浏览插件,有基于 jQuery 的,有基于 Prototype 的,也有使用原生 JavaScript 写的。
1131 0
|
7天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!