Использование веб-API WCF (REST) для поддержки потоковых данных

#wcf #rest #wcf-http

#wcf #rest #wcf-http

Вопрос:

У меня следующая проблема. Позвольте мне описать шаги, которые я предпринял до сих пор…

  1. Я создал новое приложение-службу WCF в Visual Studio
  2. Затем я обновил проект через Nuget, чтобы получить последние веб-библиотеки http (webapi.dll )
  3. Затем я создал метод service, который выглядит следующим образом

`

 [ServiceContract]
public interface IService
{
        [OperationContract]
        [WebInvoke(Method="POST", UriTemplate="{value}")]
        string GetData(int value, Stream inputDocument);
}
  

`

Теперь попытка просмотреть my .svc в браузере приводит к ошибке, которая гласит: «Чтобы запрос в operation getData был потоком, операция должна иметь единственный параметр, тип которого Stream«

Я знаю, что это проблема с конфигурацией, я просто не знаю, что нужно изменить в web.config Имейте в виду, это, похоже, было распространенной проблемой в WCF до новой поддержки HTTP, я несколько удивлен, что это не работает из коробки с новыми API.

Какие-либо указания?

Спасибо

[РЕДАКТИРОВАТЬ] Я включил свою конфигурацию…

 <system.serviceModel>
    <services>
      <service name="MyService.Service" behaviorConfiguration="serviceBehaviour">
        <endpoint behaviorConfiguration="endPointBehaviour" address="" binding="webHttpBinding" contract="MyService.IService"/>
      </service>
    </services>    
    <bindings>
      <webHttpBinding>
        <binding transferMode="Streamed" name="webHttpBinding" />
      </webHttpBinding>
    </bindings>

    <behaviors>
      <endpointBehaviors>
        <behavior name="endPointBehaviour">
          <webHttp/>
        </behavior>
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior name="serviceBehaviour">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>    
  </system.serviceModel>
  

Комментарии:

1. И как вы настроили свой сервис? Приложение-служба WCF создает SOAP-сервис, а не REST-сервис, поэтому вы должны перенастроить его на REST-сервис.

2. Спасибо, Ладислав, как мне это сделать? Пока что я настроил свою конфигурацию на использование конечной точки, использующей webHttp

3. Добавьте свою конфигурацию к вашему вопросу.

4. Итак, похоже, сообщение об ошибке направило меня по ложному пути. Я думаю, что это сообщение об ошибке должно быть гораздо более описательным. В принципе, в моем коде вообще нет ничего неправильного, просто не имеет смысла указывать моему браузеру на файл .svc, поскольку сервис не совсем является сервисом WCF. Я научился этому, продолжая и получая доступ к сервису с помощью кода. И это работает. Спасибо за помощь.

5. Вы используете webHttpBinding, который является старым компонентом WCF REST. Вы не используете материал WebAPI. Я могу рассказать вам, как разместить это в службе Windows или в ASP.NET среда, но я раньше не пробовал это просто как файл .svc.

Ответ №1:

Вы смешиваете новый материал веб-API WCF со старым материалом WCF REST. Взгляните на образец HttpHelloResource как на простейший пример того, как запустить службу Web API в IIS, или на мой пост в блоге, в котором приведен еще более простой пример службы, запущенной в консоли.

Что касается принятия потока, я думаю, что вашим самым простым вариантом была бы операция, подобная этой:

 [ServiceContract]
public interface IService
{
        [OperationContract]
        [WebInvoke(Method="POST", UriTemplate="{value}")]
        string GetData(int value, HttpRequestMessage request);
}
  

и вы можете получить поток, выполнив

 var stream = request.Content.ContentReadStream
  

Комментарии:

1. Да, я на самом деле использую новый материал Web HTTP. Поддерживается как передача HttpRequestMessage, так и Stream. Спасибо 🙂

2. Hovito: Но опубликованная вами конфигурация привязки предназначена для старого WCF REST!

3. Даррел, О… какую конфигурацию привязки я должен был использовать вместо этого? Упс, неважно. Я понимаю, что вы имеете в виду под ссылкой на образец. Спасибо!

Ответ №2:

Хорошо, похоже, сообщение об ошибке привело меня по неверному пути. Я думаю, что сообщение об ошибке должно быть гораздо более описательным. В принципе, в моем коде вообще нет ничего неправильного, просто не имеет смысла указывать моему браузеру на файл .svc, поскольку сервис не совсем является сервисом WCF. Я научился этому, продолжая и получая доступ к сервису с помощью кода. И это работает. Спасибо за помощь