Как заставить HTTP PUT и DELETE работать в Silverlight 4

Я бы предпочел не вступать в споры о том, подходят ли HTTP-команды PUT и DELETE или устарели, и сосредоточиться на вопросе о том, как заставить Silverlight работать, когда «принудительно» использовать эти команды.

Я пытаюсь создать клиентское приложение Silverlight 4, которое вызывает существующую веб-службу REST, которая выполняет операции для команд 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.

Если что-то не так с приведенным выше кодом, сообщите мне. В противном случае, если вы можете показать мне или указать на пример, демонстрирующий, как можно реализовать эти запросы, я буду очень признателен за помощь.


person SonOfPirate    schedule 16.09.2011    source источник
comment
Возможно, если бы вы действительно показали нам код, использующий HttpWebRequest   -  person AnthonyWJones    schedule 17.09.2011


Ответы (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.

person Timm    schedule 13.03.2012

Я решил свою проблему, но до сих пор не уверен на 100%, почему она исправлена.

По предложению коллеги я включил запуск приложения вне браузера и проверил настройку, требующую повышенного доверия при работе вне браузера. Приложение работало нормально. Я отключаю выход из браузера, и приложение по-прежнему работает нормально!

Как сказано в настройке, при запуске вне браузера требуется повышенное доверие. Итак, если это была проблема, то я не уверен, что проверка должна решить мою проблему при запуске В браузере. Но это так ...

person SonOfPirate    schedule 19.09.2011

Добавить 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/

person Nofield    schedule 07.11.2017