Настройте клиент WCF для использования службы WCF с помощью HTTP GET - PullRequest
4 голосов
/ 10 февраля 2011

У меня есть служба WCF, которая разрешает только HTTP-запросы GET:

[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json)]
public string GetAppData()

Служба предоставляется с помощью webHttpBinding

<system.serviceModel>
<bindings>
  <webHttpBinding>
    <binding name="AppSvcBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </webHttpBinding>
</bindings>
    <behaviors>

У меня есть клиент, чейконфиг выглядит как

<system.serviceModel>
    <client>
        <endpoint address="http://localhost/AppService/Service.svc" 
            binding="webHttpBinding" 
            bindingConfiguration="webHttpBindingConfig"
            contract="AppSvc.IService" 
            behaviorConfiguration="AppSvcBehavior"
            name="AppSvcClient">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
    </client>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingConfig">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </webHttpBinding>
</bindings>
<behaviors>
  <endpointBehaviors>
    <behavior name="AppSvcBehavior">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>
</system.serviceModel>

Мой код клиента прост:

ServiceClient client = new ServiceClient("AppSvcClient");
String result = client.GetAppData();

При выполнении этого кода я получаю ошибку:

Удаленный сервер возвратилнеожиданный ответ: (405) Метод не разрешен.

Я проверил с помощью fiddler и обнаружил, что мой клиент отправляет сообщение POST, тогда как служба ожидает GET, следовательно, ошибка.

Iхотите знать, как настроить клиент так, чтобы он отправлял GET-запрос в службу.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Используйте WebGet вместо WebInvoke

Редактировать

Начните с изменения вашего метода следующим образом:

[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json,UriTemplate = "/")]
public string GetAppData() 

Убедитесь, что webhttpbinding указан на стороне сервера.

Это исправляет это на стороне сервера.

Сделайте резервную копию вашего клиентского кода.

На стороне клиента удалите сервисную ссылку. Убедитесь, что все настройки удалены.

Затем добавьте сервисную ссылку еще раз. Теперь все будет хорошо.

0 голосов
/ 11 октября 2014

У меня была похожая проблема, когда в сгенерированном интерфейсе прокси-службы на клиенте отсутствовал атрибут WebGet в моих методах.

Я добавил атрибут вручную, и он решил проблему.

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

Кажется, что автоматический генератор прокси глючит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...