Почему мое приложение утверждает, что не может найти конечную точку WCF?

Я создал следующую конечную точку в своем приложении WCF, которая успешно работает (по крайней мере, для вызовов get) через вызовы GET:

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "Search/{platform}/{searchedContentTypeList}/?query={query}&requestedFacetGroupCountList={requestedFacetGroupCountList}&searchedFacetList={searchedFacetList}"
                        + "&start={start}&limit={limit}&endpoint={endpoint}&portalId={portalId}&resultMetaIncludeList={resultMetaIncludeList}")]
    XosSearchResults Search(string query, string platform, string requestedFacetGroupCountList, string searchedFacetList, string searchedContentTypeList,
                                    int start, int limit, string endpoint, string portalId, string resultMetaIncludeList);

Это работает локально на http://localhost/DigitalREST/XosSearch.svc, а также на нашем производственном сервисе. Запрос GET с использованием шаблона URI отлично работает в браузере, и http://localhost/DigitalREST/XosSearch.svc?wsdl, похоже, дает правильные метаданные.

Затем я зашел в свое веб-приложение и добавил http://localhost/DigitalREST/XosSearch.svc?wsdl в качестве ссылки на службу. Затем я написал следующий код для взаимодействия со службой:

        var binding = new BasicHttpBinding();
        var endpointAddr = new EndpointAddress("http://localhost/DigitalREST/XosSearch.svc?wsdl");
        var service = new XosSearchService.XosSearchClient(binding, endpointAddr);
        service.Open();

        // Run the search
        StartIndex = PageSize * SearchPageNum;
        SearchResults = service.Search(SearchQuery, Platform, null, FacetSearchString, Constants.VideoContentType, StartIndex, PageSize, Endpoint, PortalId, null);

        // Fill generic properties for outside reading
        StartIndex = (int)SearchResults.StartIndex;
        PageSize = SearchResults.PageSize;
        TotalResults = (int)SearchResults.TotalResults;

        service.Close();

При вызове метода service.Search() возникает следующее исключение:

Не было ни одной конечной точки, прослушивающей http://localhost/DigitalREST/XosSearch.svc?wsdl, которая могла бы принять сообщение. Это часто вызвано неверным адресом или действием SOAP. Дополнительные сведения см. в разделе InnerException, если он присутствует.

Внутреннее исключение:

Удаленный сервер вернул ошибку: (404) Not Found.

Даже если я уберу часть ?wsdl, я все равно получаю эту ошибку. Что я делаю неправильно?


Вот контракт IndexArticles по запросу:

    [OperationContract]
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "IndexArticles/{platform}/{portalId}")]
    void IndexArticles(string platform, string portalId);

person KallDrexx    schedule 07.03.2012    source источник
comment
Вы размещаете свои WS в IIS?   -  person M.Babcock    schedule 07.03.2012
comment
Да, на моем локальном IIS7 и на IIS 7 на наших производственных машинах   -  person KallDrexx    schedule 07.03.2012


Ответы (3)


Создайте WebHttpBinding вместо ссылки. Если вы не можете найти класс, убедитесь, что у вас есть ссылка на System.ServiceModel.Web.

WebHttpBinding binding = new WebHttpBinding()

Текущая привязка BasicHttpBinding, которую вы используете, пытается взаимодействовать через мыло.

person Tung    schedule 07.03.2012
comment
См. ответ на этот поток . Обратите внимание на <webHttp/>, определенный в поведении конечной точки. Убедитесь, что ваша привязка указывает на поведение с этим значением - person Tung; 07.03.2012
comment
Да, я понял это прямо перед тем, как ты это написал. Однако это по-прежнему не работает, поскольку в нем говорится, что операция «IndexArticles» контракта «IXosSearch» указывает несколько параметров тела запроса, которые должны быть сериализованы без каких-либо элементов-оболочек. Не более одного параметра body можно сериализовать без элементов-оболочек. Либо удалите дополнительные параметры тела, либо установите для свойства BodyStyle в WebGetAttribute/WebInvokeAttribute значение Wrapped.`, хотя все мои методы в IXosSearch имеют BodyStyle = WebMessageBodyStyle.Wrapped. - person KallDrexx; 07.03.2012
comment
Не могли бы вы опубликовать IndexArticles, как указано в вашем IXosSearch? - person Tung; 07.03.2012
comment
Мне удалось обойти это на основе stackoverflow.com/questions/4346554/, но это приводит к исходной ошибке (404) снова - person KallDrexx; 07.03.2012
comment
Это сработало для меня [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "IndexArticles/{platform}/{portalId}")] . Убедитесь, что вы изменили его как в IContract, так и в сгенерированном коде. Честно говоря, вносить изменения в reference.cs нехорошо (на самом деле модифицировать сгенерированный код никогда не бывает хорошо, потому что он стирается). Этот разработчик нашел меньшее зло, но оно все равно требует ручного труда - проверено, работает - person Tung; 07.03.2012
comment
В итоге я сдался и просто выполнил запрос GET и десериализовал Json. - person KallDrexx; 07.03.2012

У меня были такие проблемы раньше, я сохранил все, закрыл Visual Studio, а затем снова открыл его, запустив его от имени администратора (щелкните правой кнопкой мыши и выберите «Запуск от имени администратора»), возможно, попробуйте.

person Ebikeneser    schedule 07.03.2012
comment
Я уже делаю это, так как мне обычно требуется VS для подключения к IIS для отладки. Так что он всегда работает от имени администратора. - person KallDrexx; 07.03.2012

Было бы полезно увидеть конфигурации вашей конечной точки, но это может быть несколько разных вещей.

  • У вас есть метаданные?
  • Вы добавили поведение службы для метаданных?
  • Вы добавили эту конфигурацию поведения в свою службу?
person ldgorman    schedule 07.03.2012