RESTful WCF хостинг в IIS - PullRequest
0 голосов
/ 09 июня 2009

В настоящее время я пишу службу RESTful WCF на C # с использованием VS 2005. Я размещаю службу через IIS и могу перейти к .svc, но всякий раз, когда я пытаюсь перейти к любому из URI, я получаю ошибку 404. Если я запускаю wcftestclient (входит в состав VS 2008), я могу увидеть методы, поэтому я знаю, что служба работает. Проблема, похоже, связана с REST-частью реализации.

Это мой web.config:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="ServiceBehavior" name="MyAPI">
        <endpoint binding="webHttpBinding" contract="IExternalAPI"/>
        <endpoint address="mex" binding="mexHttpBinding"  contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <endpointBehaviors>
        <behavior name="ServiceBehavior">
            <webHttp/>
        </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <serviceMetadata httpGetEnabled="true"/>
        </behavior>
        </serviceBehaviors>
    </behaviors>
    </system.serviceModel>

Это контракт:

[ServiceContract()]
    interface IExternalAPI {
    [OperationContract]
    [WebGet (BodyStyle=WebMessageBodyStyle.Bare,ResponseFormat=WebMessageFormat.Json,UriTemplate="{APIKey}/Favorites/{userId}")]
    string GetFavoritesList(string APIKey, string userId);

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "{APIKey}/Addresses/{userId}")]
    string GetAddressList(string APIKey, string userId);

    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "{APIKey}/Authenticate/{userName}/{password}")]
    string Authenticate(string APIKey, string username, string password);

    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "{APIKey}/Checkout/{orderId}/{userId}/{tip}/{addressId}")]
    string Checkout(string APIKey, string orderId, string userId, string tip, string addressId);

    [OperationContract]
    [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "{APIKey}/AddToOrder/{templateId}/{userId}")]
    string AddFavoriteToOrder(string APIKey, string templateId, string userId);

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "{APIKey}/Pending/{userId}")]
    string GetPendingOrders(string APIKey, string userId);

    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "Bob")]
    string TestMethod();
    }

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 07 октября 2009

Я знаю, что это через 4 месяца после твоего поста, но я занимаюсь аналогичной ситуацией. Мой конфиг выглядит почти так же, как ваш, и у меня была такая же проблема, пока я не добавил ключ endpointBehavior. Попробуйте указать в вашей конечной точке службы явную ссылку на поведение вашей конечной точки. Может быть, это поможет.

<service behaviorConfiguration="ServiceBehavior" name="MyAPI">
    <endpoint binding="webHttpBinding" behaviorConfiguration="ServiceBehavior" contract="IExternalAPI"/>
    <endpoint address="mex" binding="mexHttpBinding"  contract="IMetadataExchange"/>
</service>
...