WCF调用返回404

时间:2015-03-23 21:08:58

标签: c# wcf

所以我有一个调用另一个WCF服务的WCF服务。我正在尝试调试第一个服务,所以我试图运行它。它失败了

  

http://<host>/ConfigurationService/ConfigurationService.svc没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。

内部异常是

  

{“远程服务器返回错误:(404)Not Found。”}

参考:

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IConfigurationService/GetGlobalConfigurationGroup", ReplyAction="http://tempuri.org/IConfigurationService/GetGlobalConfigurationGroupResponse")]
ConfigurationGroup GetGlobalConfigurationGroup();

获取确切的端点并将其放入浏览器中。把它放在WCFTestClient工作。这段代码已经在生产中运行,所以我不知道我做错了什么。我调试了调用,我发现它是作为POST而不是GET发送的。 我认为这是罪魁祸首,但我不知道如何解决它或为什么它神奇地不同。我查看了WCF method sending POST instead of GET和该答案中的链接,但我不理解它,无法使它工作,扩展它的类是生成的类,不会调试到它无论是。

我在配置服务上记录了失败请求,如果我转到错误的位置(ConfigurationService.svc1),则记录一些事情,但在调用它时则不记录。

  <system.serviceModel>
    <client>
      <endpoint address="http://<host>/SecurityService/SecurityService.svc"
        behaviorConfiguration="defaultBehavior" binding="basicHttpBinding"
        bindingConfiguration="defaultHttpBinding" contract="Service.ISecurityService"
          name="SecurityService" />
      <endpoint address="http://<host>/ConfigurationService/ConfigurationService.svc"
        behaviorConfiguration="defaultBehavior" binding="basicHttpBinding"
        bindingConfiguration="defaultHttpBinding" contract="Service.IConfigurationService"
        name="ConfigurationService" />
    </client>
    <bindings>
      <basicHttpBinding>
        <binding name="defaultHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00"
          receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2147483647" />
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="defaultBehavior">
          <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="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>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

配置服务配置:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
    <services>
      <service name="ConfigurationService" behaviorConfiguration="defaultBehavior">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="defaultHttpBinding"
                  contract="IConfigurationService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="defaultHttpBinding" maxReceivedMessageSize="2147483647" openTimeout="00:10:00" closeTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00">
          <readerQuotas maxStringContentLength="2147483647" maxArrayLength="20971520"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="defaultBehavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

编辑:我注意到它只在运行Web项目时表现出这种行为。

3 个答案:

答案 0 :(得分:1)

尝试在您尝试呼叫的服务中使用数据合同。

https://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx

这里简要说明它们是什么以及它们是如何工作的。

我认为这是错误,因为您的错误&#39; OperationContractAttribute&#39;

也许只是ServiceContract。

我希望这会有所帮助

答案 1 :(得分:1)

在分布服务且使用这些服务的应用程序通过WCF进行通信的多进程环境中,服务契约必须是可序列化的。确保合同对象序列化的最简单方法是使用数据协定属性修饰它们,如下所述:https://msdn.microsoft.com/en-us/library/ms733127%28v=vs.110%29.aspx

如果没有正确的序列化,您的服务仍然可以在某些条件下运行,除非您在调试时附加到所有相关进程,否则不会看到任何错误。即使记录有时也无法显示任何内容(或至少任何有用的内容)。

由于您正在使用dataContractSerializer,因此这可能不是配置问题。装饰您的服务合同类,以便可以通过WCF序列化。

答案 2 :(得分:0)

我曾经遇到过这个问题。事实证明,在我的Web项目配置中,我的服务地址错误。