2012-05-29 2 views
1

TL; DR - У меня есть [WebGet(UriTemplate = "/")] и он не работаетRoot UriTemplate становится угнано WCF странице справки


У меня есть службы WCF, которая выглядит следующим образом:

public interface IUserService 
{ 
    // This doesn't work 
    [OperationContract] 
    [WebGet(UriTemplate = "/")] 
    IList<User> GetAllUsers(); 

    ///////////////////////////////////// 
    // Everything below this works 
    ///////////////////////////////////// 

    [OperationContract] 
    [WebGet(UriTemplate = "/{id}/")] 
    User GetUserById(string id); 

    [OperationContract] 
    [WebInvoke(UriTemplate = "/", Method = "POST")] 
    IList<User> AddUser(); 

    [OperationContract] 
    [WebInvoke(UriTemplate = "/{id}/", Method = "PUT")] 
    IList<User> UpdateUser(string id, User user); 
} 

Ниже приведена конфигурация для конечной точки

<service name="MyCompany.UserService"> 
    <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:80/api/users/" /> 
     </baseAddresses> 
    </host> 
    <endpoint address="" 
         behaviorConfiguration="WebHttpBehavior" 
         binding="webHttpBinding" 
         contract="MyCompany.IUserService" /> 
    <endpoint address="mex" 
         binding="mexHttpBinding" 
         contract="IMetadataExchange" /> 
    <endpoint address="soap" 
     binding="wsHttpBinding" 
     contract="MyCompany.IUserService" /> 
</service> 

Как вы c см., я обслуживаю как REST, так и SOAP из этой службы. Этот вопрос касается только REST.

В моем браузере (так что GET "/" в условиях WCF) Я получаю справочную страницу WCF, описывающую конечную точку - тот, который полезен для SOAP, но не очень помогает REST. Однако, если я что-то делаю, он работает так, как ожидалось. Если I POST к этому URL-адресу, или GET /123456, я получаю нормальные ответы JSON (как, в действительности он выполняет мою службу).

Похоже, что WCF захватывает операцию «/». Есть ли способ отключить это поведение «помощи» WCF, чтобы я мог выполнять свои операции? Любые предложения очень ценятся.

ответ

3

Во-первых, вы можете отключить справочную страницу службы, используя следующие опции конфигурации:

<serviceBehaviors> 
    <serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" /> 
</serviceBehaviors> 

Однако, это сделает базовый адрес возврата сервиса WSDL по умолчанию. Таким образом, чтобы двигаться, что вы также можете использовать эту опцию конфигурации:

<serviceBehaviors> 
    <serviceMetadata httpGetEnabled="true" httpGetUrl="wsdl"/> 
</serviceBehaviors> 

Это переместит WSDL URL для your_service_base_address + "WSDL WSDL?".