前两天兴冲冲的在学习RESTful Web Services,并试着做出来一个较“纯”的Service:
[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实例的这一句
修改为:
即可。
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配置,对不对大家做个参考吧。
<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>