Как устранить неполадки 404 при вызове моей службы REST? - PullRequest
2 голосов
/ 09 ноября 2011

Я создал службу WCF и выставил две конечные точки; один для SOAP и один для ОТДЫХА. Конечная точка SOAP работает и доступна для веб-клиентов, консольных приложений и т. Д. Конечная точка REST была создана сегодня утром и не работает. Я подтвердил, что служба SOAP все еще доступна, поэтому эта проблема относится только к части REST или изменениям конфигурации, внесенным сегодня утром.

В браузере я пытаюсь перейти на http://ABC:99/json/categories. Я получаю 404 - Файл или каталог не найдены.

Я добавил следующий атрибут к методу в классе, который реализует интерфейс службы:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "categories")]

и это к другому методу:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "reports/{categoryId}")]

Соответствующие части файла конфигурации находятся здесь:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="NewBinding0" maxBufferSize="524288" maxReceivedMessageSize="524288" transferMode="StreamedResponse"
      closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" receiveTimeout="00:10:00" />
    </basicHttpBinding>
  </bindings>

  <services>
    <service name="XXX.ReportGenerator">
      <endpoint address="" binding="basicHttpBinding" bindingConfiguration="NewBinding0"
      contract="XXX.YYY.IReportGenerator">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>

    <service name="ReportingSvc.JSON">
      <endpoint address="json" binding="webHttpBinding"
      contract="XXX.YYY.ReportingSvc.IReportGenerator" behaviorConfiguration="jsonEndpoint" />
      <host>
        <baseAddresses>
          <add baseAddress="http://ABC:99/" />
        </baseAddresses>
      </host>
    </service>

  </services>

  <behaviors>

    <endpointBehaviors>
      <behavior name="jsonEndpoint">
        <webHttp />
      </behavior>
    </endpointBehaviors>

    <serviceBehaviors>
      <behavior>


        <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
        <serviceMetadata httpGetEnabled="true"/>
        <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Любые предложения с благодарностью! Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Если ваш метод предназначен просто для выполнения операции GET, лучше использовать атрибут WebGet, а не WebInvoke и указывать ваш метод как GET.

Кроме того, URL для вашей службы для первого метода будет следующим:

http://ABC:99/categories/json

URL для 2-го метода будет

http://ABC:99/reports/5/json

Это потому, что выопределяя адрес как "json" в качестве адреса конечной точки, который добавляется к базовому URL + URL ресурса + адрес конечной точки.

0 голосов
/ 09 ноября 2011

Я не могу оказать вам конкретную помощь по службам REST в WCF, поскольку у меня там нет опыта, но в прошлом отслеживание WCF было для меня спасением во многих случаях. Просто следуйте инструкциям, чтобы добавить следующее в web.config вашей службы WCF:

<configuration>
   <system.diagnostics>
      <sources>
            <source name="System.ServiceModel" 
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="traceListener" 
                   type="System.Diagnostics.XmlWriterTraceListener" 
                   initializeData= "c:\log\Traces.svclog" />
            </listeners>
         </source>
      </sources>
   </system.diagnostics>
</configuration>

Очевидно, что при необходимости вы измените путь к вашему журналу и убедитесь, что для заданной вами папки установлены правильные разрешения, но это по сути. Как только трассировка начинает регистрироваться, вы можете использовать Service Trace Viewer , который, я считаю, установлен по умолчанию, чтобы просмотреть трассировку и посмотреть, не можете ли вы точно определить источник вашей проблемы.

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...