从客户端应用程序调用WCF服务会收到EndpointNotFoundException,但在浏览器上不会出错

时间:2012-05-29 21:26:13

标签: .net wcf soap

我有一个新创建的WCF .SVC,它托管在一个ASP.NET网站中,该网站也托管传统的ASMX样式服务。

如果我调用SVC中包含的单个方法,我会收到以下消息。

“没有端点侦听http://localhost/REDACTEDSITE/LicenseVerification.svc可以接受该消息。这通常是由不正确的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。”

但是,我可以将该链接粘贴到我本地计算机上的任何浏览器中,然后获取“这是Windows©Communication Foundation服务。此服务的元数据发布目前已禁用。”页面。

IIS日志显示浏览器正在发出GET请求并收到200响应。 WCF客户端发出POST请求并接收404.0响应。

这些是我使用的最新配置设置。它们有点微不足道。

宿主

<system.serviceModel>
   <client entries for other services that work>

    <services>
      <service name="LicenseVerification.svc">
        <endpoint address="LicenseVerification.svc"
            binding="basicHttpBinding" bindingConfiguration="" contract="Management.ILicenseVerification" />
      </service>
    </services>

  </system.serviceModel>

客户

<system.serviceModel>
    <client>
      <endpoint address="http://localhost/REDACTEDSITE/LicenseVerification.svc"
          binding="basicHttpBinding" bindingConfiguration="" contract="Management.ILicenseVerification"
          name="LicenseVerificationClient">
      </endpoint>
    </client>
  </system.serviceModel>

合同

 [ServiceContract]
    public interface ILicenseVerification
    {
        [WebInvoke(Method="GET")] //have tried WebGet()
        [OperationContract]
        LicenseInfo GetProfileLicenseInfo(string profileName);
    }

服务impl

  public class LicenseVerification : ILicenseVerification
    {
        LicenseInfo ILicenseVerification.GetProfileLicenseInfo(string profileName)
        {
            ProfileInfo _pi = ProfileHelper.GetRequestedProfileInfo(profileName);
            if (_pi == null)
            {
                return null;
            }

            return LicenseVerifier.GetLicenseInfo(_pi);
        }
    }

我尝试重新注册asp.net 4.0,修复服务模型,重新启动IIS,使用MS服务配置实用程序并手动删除和重新创建配置文件,但我仍然无法使用它。

这些是小请求(几KB),所以我认为这不是一个大小问题。

唯一突出的是GET / POST,但这对我之前制作的SVC来说并不是一个问题。

我的本​​地环境是Win7 / 64,VS2010,.NET 4。

请让我知道还有什么可以尝试。我已经剔除了同样的各种SO帖子而没有运气(即使那些看起来完全不同的那些)。

2 个答案:

答案 0 :(得分:1)

服务器配置中<service>元素的“name”属性值不正确。它应列出服务类的完全限定名称(可能是Management.LicenseVerification),而不是.svc文件的名称。

还有一些问题:

  • 您在操作中使用[WebInvoke(Method = "GET")]。如果您希望通过GET
  • 访问,请使用[WebGet]
  • [WebInvoke](和[WebGet])仅适用于使用webHttpBinding并且端点行为为<webHttp/>的端点,没有您拥有的端点(您正在使用{{1 }})。
  • 浏览器正在发送GET请求,但它没有调用该操作,它可能正在获取服务帮助页面。所以它可能不是真正从浏览器“工作”。

答案 1 :(得分:0)

在遵循carlosfigueira的建议并删除[web *]属性并在配置中修复服务名称后,我能够获得正确的服务帮助页面,但这仍然无法从客户端运行。

但是,我现在能够使用svcutil来生成我的服务所需的代码和配置。我从生成的output.config文件中发现的是端点地址在末尾是重复的,就像这样......

http://localhost/REDACTEDSITE/LicenseVerification.svc/LicenseVerification.svc

这是客户端为了使用该服务而需要点击的端点,当我更新客户端配置以命中该端点时,它已经工作了!

这仍然不是最优的,所以我尝试从我的服务配置中删除地址元素,以便它现在看起来像这样(没有行为配置)。

  <service name="Management.LicenseVerification">
    <endpoint binding="basicHttpBinding" contract="Management.ILicenseVerification" />
  </service>

它仍然有效!

我有点困惑为什么这会附加地址元素,除了它可能是在asp.net中托管它的副作用。在这种情况下,可能不需要配置地址元素(和基地址)?

无论如何,这现在正在发挥作用。