#wcf #rest #wcf-http
#wcf #rest #wcf-http
Вопрос:
У меня следующая проблема. Позвольте мне описать шаги, которые я предпринял до сих пор…
- Я создал новое приложение-службу WCF в Visual Studio
- Затем я обновил проект через Nuget, чтобы получить последние веб-библиотеки http (webapi.dll )
- Затем я создал метод 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. Я научился этому, продолжая и получая доступ к сервису с помощью кода. И это работает. Спасибо за помощь