在版本化服务契约之后,不能访问WCF服务

本文关键字:服务 不能 访问 WCF 契约 版本 之后 | 更新日期: 2023-09-27 17:51:02

我很难弄清楚一个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。结束[TAsyncResult] (IAsyncResult结果)在System.ServiceModel.Activation.HostedHttpRequestAsyncResult。结束(IAsyncResult结果)进程名称:w3wp进程ID: 8148

现在有点难住了,希望能得到任何帮助:)

在版本化服务契约之后,不能访问WCF服务

你需要在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>