Создание веб-службы 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, если вы указываете несколько конечных точек/привязок в конфигурации.