版本化服务合同后无法访问 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 服务:如何从托管应用程序访问实现服务合同的对象?