Как заставить HTTP PUT и DELETE работать в Silverlight 4 - PullRequest
2 голосов
/ 16 сентября 2011

Я бы предпочел не вступать в дискуссию о том, являются ли 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.

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

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

В вашем файле clientaccesspolicy.xml вы должны разрешить HTTP-глаголы PUT и DELETE.

Я обычно разрешаю все глаголы 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 голос
/ 20 сентября 2011

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

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

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

0 голосов
/ 07 ноября 2017

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

...