如何使HTTP PUT和DELETE在Silverlight 4中工作

时间:2011-09-16 18:09:12

标签: silverlight-4.0 httpwebrequest webclient clientaccesspolicy.xml httpverbs

我宁愿避免讨论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客户端进行这些(异步)调用的方法。

如果上述代码有问题,请告诉我们。否则,如果您可以向我展示或指出一个示例,说明如何实现这些请求,我将非常感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

clientaccesspolicy.xml文件中,您必须允许PUTDELETE 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);

https://mattduffield.wordpress.com/2011/12/11/silverlight-specified-method-is-not-supported-on-this-request/