Root UriTemplate被WCF帮助页面劫持

时间:2012-05-29 21:20:10

标签: .net wcf rest uritemplate

TL; DR - 我有[WebGet(UriTemplate = "/")]但无效


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

如您所见,我通过此服务提供REST和SOAP服务。这个问题只涉及REST。

当我在浏览器中转到http://localhost:80/api/users/时(在WCF术语中GET "/"),我得到了描述端点的WCF帮助页面 - 一个对SOAP有用但对REST没什么帮助的端点。但是,如果我做了其他任何事情,它会按预期工作。如果我POST到此网址或GET /123456,我会获得正常的JSON响应(例如,它实际上会执行我的服务)。

似乎WCF正在劫持“/”操作。有没有办法关闭这个WCF“帮助”行为,以便我可以执行我的操作?任何建议都非常感谢。

1 个答案:

答案 0 :(得分:3)

首先,您可以使用以下配置选项禁用服务帮助页面:

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

但是,这将使基地址默认返回服务wsdl。所以要移动它,你也可以使用这个配置选项:

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

这会将wsdl网址移动到your_service_base_address +“wsdl?wsdl”。