1

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/在浏览器中访问时(所以GET "/"用 WCF 术语),我会看到描述端点的 WCF 帮助页面——该页面对 SOAP 很有用,但对 REST 帮助不大。但是,如果我做任何其他事情,它会按预期工作。如果我POST访问此 URL 或GET /123456,我会得到正常的 JSON 响应(例如,它实际上执行了我的服务)。

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

4

1 回答 1

3

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

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

但是,这将使基地址默认返回服务 wsdl。因此,要移动它,您还可以使用此配置选项:

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

这会将 wsdl url 移动到 your_service_base_address + "wsdl?wsdl"。

于 2012-06-13T18:17:08.010 回答