我宁愿避免讨论HTTP动词PUT和DELETE是否适当或过时,并且在“强制”使用这些动词时专注于实际使Silverlight工作的问题。
我正在尝试创建一个Silverlight 4客户端应用程序,该应用程序调用现有的REST Web服务,该服务具有PUT和DELETE谓词的操作。这项服务不会改变。
我在App.xaml.cs中将以下语句添加到构造函数中:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
该服务有一个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>
</cross-domain-access>
</access-policy>
我正在使用WebClient类来处理GET和POST请求。当我尝试用动词/方法的PUT或DELETE做同样的事情时,我得到一个模糊的“安全错误”,这导致我添加上述语句。
我已经看到各种帖子和博客文章谈论使用HttpWebRequest来解决这个问题,但是没有找到一个实际上如何从Silverlight客户端进行这些(异步)调用的方法。
如果上述代码有问题,请告诉我们。否则,如果您可以向我展示或指出一个示例,说明如何实现这些请求,我将非常感谢您的帮助。
答案 0 :(得分:3)
在clientaccesspolicy.xml
文件中,您必须允许PUT
和DELETE
HTTP动词。
我通常允许所有HTTP动词,在原始配置下看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*" http-methods="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
请注意http-methods
元素上添加的allow-from
属性。
答案 1 :(得分:1)
我已经解决了我的问题,但我仍然不能100%确定为什么要修复它。
根据同事的建议,我启用了在浏览器外运行应用程序并检查设置,以便在浏览器外部运行时需要提升信任。该应用运行正常。我禁用了浏览器以外的应用程序,应用程序运行正常!
正如设置所说,在浏览器外面运行时需要提升信任度。所以,如果这是问题所在,那么我不确定在浏览器中运行时检查它是否应该解决我的问题。但它确实......
答案 2 :(得分:0)
添加
HttpWebRequest.RegisterPrefix("http://",WebRequestCreator.ClientHttp);
HttpWebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);