0

我有一个新创建的 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);
    }

服务内涵

  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 帖子并且没有运气(即使是那些看起来明显不同的帖子)。

4

2 回答 2

1

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

还有几个问题:

  • [WebInvoke(Method = "GET")]在你的操作中使用。[WebGet]如果您希望通过 GET 访问它,请改用
  • [WebInvoke](和 [WebGet])仅适用于使用webHttpBinding并且具有端点行为的端点<webHttp/>,而您没有(您正在使用basicHttpBinding)的端点。
  • 浏览器正在发送 GET 请求,但它没有调用操作,它可能正在获取服务帮助页面。所以它可能不是真正从浏览器“工作”。
于 2012-05-29T21:53:21.323 回答
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 中托管它的副作用。也许在这种情况下不需要配置地址元素(和基地址)?

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

于 2012-05-30T13:12:57.217 回答