Как мне устранить неполадку 404 при вызове моей службы REST?

#wcf #rest

#wcf #rest

Вопрос:

Я создал службу WCF и предоставил две конечные точки; одну для SOAP и одну для REST. Конечная точка 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>
  

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

Комментарии:

1. Я новичок в службах REST — есть ли причина, по которой ваш контракт отличается между конечными точками REST и SOAP?

2. @Zannjaminderson — Моя ошибка. На самом деле они не отличаются. Я изменил приведенный выше код.

Ответ №1:

Я не могу предоставить вам конкретную помощь по службам 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:logTraces.svclog" />
            </listeners>
         </source>
      </sources>
   </system.diagnostics>
</configuration>
  

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

Редактировать

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

Ответ №2:

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

Также URL-адрес вашей службы для первого метода будет таким, как показано ниже:

 http://ABC:99/categories/json
  

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

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

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