Создание веб-службы WCF с помощью запросов GET
Фон
Я уже создал веб-службы ASMX в прошлом и смог получить доступ к сервису из веб-браузера и запросов AJAX GET с использованием соглашения об адресе:
MyService.asmx/MyMethod?Param=xxx
Я только что начал использовать WCF и создал новый веб-сервис в моем проекте ASP.NET. Он создает файл с расширением .svc, таким как MyService.svc.
Текущая ситуация
Я могу использовать сервис, используя WcfTestClient
, который поставляется с VS2008. Я также могу создать собственный WCF-клиент, добавив ссылку на службу в другой проект или используя командную строку svcutil.exe
для создания прокси-сервера и файла конфигурации.
Проблема
Когда я пытаюсь использовать службу из браузера с помощью MyService.svc/MyMethod?MyParam=xxx
, я получаю пустую страницу без каких-либо ошибок.
Что я пробовал
Я уже добавил basicHttpBinding в web.config и сделал его HttpGetEnabled в конфигурации поведения. Я также добавил атрибут [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")]
к моему операционному контракту.
Я уже следил за информацией в этом другом вопросе:
Конечные точки REST/SOAP для службы WCF
Однако после выполнения этих шагов я либо получаю пустую страницу, либо ошибку HTTP 404. В коде нет ничего особенного. Я просто беру строку в качестве параметра и возвращаю "Hello xxx". Это базовая вещь типа "Hello WCF World".
UPDATE - здесь соответствующий код
[ServiceContract]
public interface IMyService
{
[WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")]
[OperationContract]
string MyMethod(string MyParam);
}
Web.Config - system.serviceModel Section
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint address=""
binding="wsHttpBinding" contract="IMyService" />
<endpoint address="MyService.svc"
binding="basicHttpBinding" contract="IMyService" />
<endpoint address="mex"
binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
Ответы
Ответ 1
Глядя на ваш раздел web.config
serviceModel, я вижу, что вам нужно добавить webHttpBinding и связать endPointBehavior, включающий webHttpGet.
Ваш операционный договор верен. Вот как выглядит ваш раздел конфигурации system.serviceModel, чтобы вы могли использовать эту услугу из запроса GET HTTP.
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="WebBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint address="ws" binding="wsHttpBinding" contract="IMyService"/>
<endpoint address="" behaviorConfiguration="WebBehavior"
binding="webHttpBinding"
contract="IMyService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
Обязательно назначьте другой адрес вашей конечной точке wsHttpBinding, иначе вы получите сообщение об ошибке, говорящее, что у вас есть две конечные точки, прослушивающие один и тот же URI.
Другой вариант - оставить адрес пустым в wsHttpBinding, но назначить другой адрес службе webHttpBinding. Однако это также изменит ваш адрес GET.
Например, если вы назначаете адрес как "asmx", вы вызываете свою услугу с адресом "MyService.svc/asmx/MyMethod?MyParam=xxxx
".
Ответ 2
Обычные запросы WCF всегда являются SOAP-запросами - вы не сможете это сделать только с вашим браузером, для этого вам понадобится Testclient WCF.
В WCF есть надстройка для WCF, которая называется WCF REST Starter Kit (который также будет включен в WCF 4.0 с .NET 4.0), который позволяет вам использовать команды GET/POST/PUT/DELETE HTTP для запроса услуг WCF и т.д. Однако вам нужно писать свои услуги специально для REST - вы не можете иметь SOAP и REST при одном и том же вызове службы.
Марк
Ответ 3
Как marc_s говорит, может помочь REST Starter Kit, но вы также должны знать, что .NET 3.5 поддерживает поддержку REST-сервисов непосредственно в нем. Это не так полно, как то, что вы можете сделать с стартовым комплектом, но это полезно.
Как он работает, вы добавляете атрибут [WebGet]
в свои операции, чтобы указать, где в URL должны появляться различные параметры:
[WebGet(UriTemplate = "helloworld/{name}")]
string Helloworld(string name);
См. этот портал для тонны информации.
Обратите внимание, что вы можете иметь ту же службу, что и SOAP и REST, если вы указываете несколько конечных точек/привязок в конфигурации.