Заставить веб-службу WCF работать с запросами GET


ОБНОВЛЕНИЕ - Вот соответствующий код

Справочная информация
Я создал ASMX веб-сервисов в прошлом, и смогли получить доступ к службе из веб-браузера и Ajax GET запросы с помощью адресной конвенции:
MyService.asmx/MyMethod?Param=xxx

Я только начал использовать WCF и создал новый веб-сервис в моем проекте ASP.NET. Он создает файл с расширением .svc, таким как MyService.svc.

Текущая ситуация
Я могу потреблять услугу с помощью WcfTestClient that comes with VS2008. I am also able to create my own WCF Client by either adding a service reference in another project or using the , который поставляется с VS2008. Я также могу создать свой собственный клиент WCF, либо добавив ссылку на службу в другом проекте, либо используя командную линию "-4" для создания прокси-файла и файла.

Проблема
Когда я пытаюсь использовать услугу из браузера с помощью MyService.svc/MyMethod?MyParam=xxx, I get a blank page without any errors. , я получаю пустую страницу без каких-либо ошибок.

То, что я пытался
Я уже добавил basicHttpBinding to the web.config and made it на web.config и сделал это HttpGetEnabled in the behavior configuration. I also added the [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] attribute to my operation contract. attribute to my operation contract. в конфигурации поведения. Я также добавил атрибут [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] attribute to my operation contract. к моему контракту на эксплуатацию.

Я уже следил за информацией в этом другом стек переполнения вопрос:
REST / SOAP EndPoints for a WCF Service

Однако, я либо получить пустую страницу или HTTP 404 Ошибка после следующих этих шагов. В коде нет ничего особенного. Я просто принимая в строке в качестве параметра и возвращения "Hello xxx". Это основной "Hello WCF World" доказательство концепции типа вещь.

[ServiceContract]
public interface IMyService
{
    [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")]
    [OperationContract]
    string MyMethod(string MyParam);
}

Web.Config - system.serviceModel Раздел

<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>

Ответ на: "Заставить веб-службу WCF работать с запросами GET"

Количество ответов:3

Нормальные запросы WCF всегда SOAP запросы - вы не сможете получить это происходит только с вашим браузером, вам понадобится WCF Testclient для этого.

Существует дополнение для WCF называется WCF REST Starter Kit (which will also be included in WCF 4.0 with .NET 4.0), which allows you to use GET/POST/PUT/DELETE HTTP commands to query WCF services and such. You need to write your services specifically for REST, though - you can't have SOAP and REST on the same service call. (который также будет включен в WCF 4.0 с .NET 4.0), который позволяет использовать GET / POST / PUT / DELETE HTTP команды для запроса WCF услуг и такие. Вы должны написать свои услуги специально для REST, хотя - вы не можете иметь SOAP и REST на том же вызове службы.

Марк

Как marc_s says, the REST Starter Kit can help, but you should also be aware that .NET 3.5 has support for REST services directly in it. It's not quite as complete as what you can do with the starter kit, but it is useful. , REST Starter Kit может помочь, но вы также должны знать, что .NET 3.5 имеет поддержку услуг REST непосредственно в нем. Это не совсем так полно, как то, что вы можете сделать с стартовым комплектом, но это полезно.

Как это работает, что вы положили [WebGet] attribute on your operations to indicate where in the URL the various parameters should come from: атрибут на ваших операциях, чтобы указать, где в URL различные параметры должны исходить от:

[WebGet(UriTemplate = "helloworld/{name}")]
string Helloworld(string name);

Смотрите this portal for tons of information. для тонн информации.

Примечание, вы можете иметь тот же сервис подвергается как SOAP и REST, если вы укажете несколько конечных точек / привязки в конфигурации.

Глядя на ваш web.config serviceModel section, I can see that you need to add a сервисМодель разделе, я вижу, что вам нужно добавить webHttpBinding and associate an endPointBehavior that includes и ассоциированных endPointBehavior, который включает в себя webHttpGet. .

Ваш контракт на эксплуатацию является правильным. Вот как ваш system.serviceModel config раздел должен выглядеть для того, чтобы вы могли потреблять услугу от 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". ". -99-"