版本化服务合同后无法访问 WCF 服务

Posted

技术标签:

【中文标题】版本化服务合同后无法访问 WCF 服务【英文标题】:Can't access WCF service after versioning service contracts 【发布时间】:2015-08-12 02:00:40 【问题描述】:

我在解决 WCF 服务的问题时遇到了麻烦,该服务是在我对其实施“v2”合同以扩展功能后出现的。一切都很好,但是当我尝试在浏览器中访问该服务时,我只是被告知它无法连接。当我尝试将其添加为服务参考时,我收到有关连接问题的类似消息。但是,当我从配置文件中删除扩展合同的端点并保持之前的“v1”版本不变时,它可以正常工作。

这是“v1”合约:

namespace Company.Services.Ticketing.Retail.Contracts

    [ServiceContract(Name = "OutletReportingContract_v1", Namespace = "https://enterprise.company.ie/Services/Retail")]
    public interface IOutletReportingContract_v1
    
        /* methods */
    

这里是“v2”合约:

namespace Company.Services.Ticketing.Retail.Contracts

    [ServiceContract(Name = "OutletReportingContract_v2", Namespace = "https://enterprise.company.ie/Services/Retail")]
    public interface IOutletReportingContract_v2 : IOutletReportingContract_v1
    
        /* methods */
    

这里是 Web.config 中的端点:

  <service name="Company.Services.Ticketing.Retail.OutletService" behaviorConfiguration="Public">
    <endpoint address="1" binding="wsHttpBinding" bindingConfiguration="Standard" name="OutletReportingContract_v1" 
        contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v1" />
    <endpoint address="2" binding="wsHttpBinding" bindingConfiguration="Standard" name="OutletReportingContract_v2" 
        contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v2" />
    <endpoint address="mex" binding="mexHttpsBinding" name="IMetadataExchange" contract="IMetadataExchange" />
  </service>

以下是事件查看器中显示的错误消息:

WebHost 未能处理请求。 发件人信息:System.ServiceModel.Activation.HostedHttpRequestAsyncResult/28075619 异常:System.Web.HttpException (0x80004005):在“https://phil-pc.company.local/Services/Retail/OutletService.svc/_vti_bin/ListData.svc/$metadata”处没有主动监听的通道。这通常是由不正确的地址 URI 引起的。确保将消息发送到的地址与服务正在侦听的地址相匹配。 ---> System.ServiceModel.EndpointNotFoundException:没有通道在“https://phil-pc.company.local/Services/Retail/OutletService.svc/_vti_bin/ListData.svc/$metadata”处主动监听。这通常是由不正确的地址 URI 引起的。确保将消息发送到的地址与服务正在侦听的地址相匹配。 在 System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult 结果) 在 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() 在 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() 在 System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult 结果) 在 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult 结果) 进程名称:w3wp 进程 ID:8148

现在有点难过,希望有任何帮助:)

【问题讨论】:

【参考方案1】:

您需要在 web.config 中分离您的服务声明。

假设您的实现类被命名为 OutletService_v1 和 OutletService_v2,您最终应该得到类似的结果:

<services>
  <service name="Company.Services.Ticketing.Retail.OutletService_v1" behaviorConfiguration="Public">
    <endpoint binding="wsHttpBinding" bindingConfiguration="Standard" contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v1" />
    <endpoint address="mex" binding="mexHttpsBinding" name="IMetadataExchange" contract="IMetadataExchange" />
  </service>

  <service name="Company.Services.Ticketing.Retail.OutletService_v2" behaviorConfiguration="Public">
    <endpoint binding="wsHttpBinding" bindingConfiguration="Standard" contract="Company.Services.Ticketing.Retail.Contracts.IOutletReportingContract_v2" />
    <endpoint address="mex" binding="mexHttpsBinding" name="IMetadataExchange" contract="IMetadataExchange" />
  </service>
</services>

【讨论】:

您好,谢谢您的回复!我实际上忘记添加 v2 合同继承自 v1 合同的事实,我已经更新了我的帖子以反映这一点。关于您的解决方案,问题是我在帖子中使用的格式适用于其他服务,并且在实现上没有明显差异。

以上是关于版本化服务合同后无法访问 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

自托管 WCF 服务:如何从托管应用程序访问实现服务合同的对象?

如何在数据合同 WCF 中使用枚举

WCF 服务端点无法从本地访问

无法通过 https 访问 WCF 服务

WCF调试错误:添加服务失败。服务元数据可能无法访问。请确保服务正在运行并且正在公开元数据。

外部客户端无法访问 Azure Service Fabric 上的 WCF 通信侦听器