[原]Silverlight3 支持所有HTTP方法

前两天兴冲冲的在学习RESTful Web Services,并试着做出来一个较“纯”的Service:

    [ServiceContract]
    [ServiceKnownType(
typeof(Atom10FeedFormatter))]
    
public interface ICleverCalendarSvc
    {
        [OperationContract]
        [WebGet(UriTemplate 
= "Calendars", BodyStyle = WebMessageBodyStyle.Bare)]
        Atom10FeedFormatter Query();

        [OperationContract]
        [WebInvoke(UriTemplate 
= "Calendars" , Method = "POST", RequestFormat = WebMessageFormat.Xml)]
        Atom10FeedFormatter Create(Atom10ItemFormatter
<SyndicationItem> formatter);

        [OperationContract]
        [WebInvoke(UriTemplate 
= "Calendars", Method = "PUT", RequestFormat = WebMessageFormat.Xml)]
        Atom10FeedFormatter Update(Atom10ItemFormatter
<SyndicationItem> formatter);

        [OperationContract]
        [WebInvoke(UriTemplate 
= "Calendars", Method = "DELETE", RequestFormat = WebMessageFormat.Xml)]
        Atom10FeedFormatter Delete(Atom10ItemFormatter
<SyndicationItem> formatter);
    }

 试用我新做的Silverlight RESTful客户端调用一下,结果令人沮丧的very:

百度上查一下,得知Silverlight不支持HTTP方法中的PUT和DELETE。买糕的!RESTful是我喜欢的,Silverlight也是我喜欢的,这可真要命,难道要放弃Silverlight?昨晚突然有一个想法,Silverlight的WebRequest不支持全部的HTTP方法,那可不可以自已做一个支持GET,POST,PUT,DELETE的WebRequest呢,有了这种念头,一大早来就开始上网看看有没有现成可用的Silverlight下的WebRequest,结果发现Silverlight并不是不支持PUT和DELETE方法(血的教训再一次告诉我们,不可偏听偏信,尽信Baidu不如少用Baidu),通过一些方法,Silverlight的WebRequest还是可以支持PUT,和DELETE的。具体做法简单的very:

将获取WebRequest实例的这一句

this.webRequest = WebRequest.Create(this.targetUri);

修改为:

this.webRequest = WebRequestCreator.ClientHttp.Create(this.targetUri);

即可。

MSDN曰:

借助于 Silverlight,您可以指定是由浏览器还是客户端为基于 Silverlight 的应用程序提供 HTTP 处理。默认情况下,HTTP 处理是由浏览器执行的,您必须进行选择才能使用客户端 HTTP 处理。 

下面是您通常将为其指定客户端 HTTP 处理的方案的列表。

  • 使用 HTTP 方法,而不是 GET 和 POST。

  • 在应用程序中或出于调试目的使用响应状态代码标题和响应正文。

  • 发送 XML HTTP 请求,如 REST 和 SOAP 消息。

  • 手动管理 cookie。

到这儿似乎已经圆满结束了,但是MSDN又曰:

GET 和 POST 以外的方法

仅限客户端

仅对客户端 HTTP 处理允许。

必须根据客户端访问策略文件来允许。

“必须根据客户端访问策略文件来允许”这一句话似乎要让clientaccesspolicy.xml也要参与此事,但是事实是在VS2008开发环境中,不修改clientaccesspolicy.xml任何内容客户端也能正常访问服务,莫非这句话是指部署在IIS后的情景?不管怎么说,写了个clientaccesspolicy.xml配置,对不对大家做个参考吧。

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  
<cross-domain-access>
    
<policy>
      
<allow-from http-request-headers="*" >
        
<domain uri="*"/>
      
</allow-from>
      
<grant-to>
        
<resource path="/" include-subpaths="true"/>
      
</grant-to>
    
</policy>
    
<policy>
      
<allow-from http-methods="*">
        
<domain uri="*"/>
      
</allow-from>
      
<grant-to>
        
<resource path="/" include-subpaths="true"/>
      
</grant-to>
    
</policy>
  
</cross-domain-access>
</access-policy>
原文地址:https://www.cnblogs.com/think8848/p/1616981.html