如何在调用REST服务时对404进行故障排除?

时间:2011-11-09 17:17:50

标签: wcf rest

我创建了一个WCF服务并公开了两个端点;一个用于SOAP,一个用于REST。 SOAP端点可以工作,可以从Web客户端,控制台应用程序等访问.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 :(得分:0)

我无法在WCF中为您提供有关REST服务的具体帮助,因为我没有经验,但WCF Tracing在过去的多个实例中一直是我的救星。只需按照说明将以下内容添加到WCF服务的web.config:

<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来查看跟踪,看看是否无法查明问题的根源。

修改

请注意,服务跟踪是超级资源密集型的,因此只有在您需要它来调试问题时再将其打开,然后在您不再需要它时将其关闭。

答案 1 :(得分:0)

如果您的方法仅用于执行GET操作,则最好使用WebGet属性而不是使用WebInvoke并将方法指定为GET。

第一种方法的服务网址如下:

http://ABC:99/categories/json

第二种方法的网址是

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

这是因为您将地址定义为“json”作为您的端点地址,该地址将附加到基本URL +资源URL +端点地址。