目前,这是一个相当复杂的过程,因为该工具似乎不支持生成 WCF 客户端代码或从配置文件自动映射的方式。此外,正如 dotnetstep 所指出的,ASP.NET 团队尚未将 System.ServiceModel 移植到 5(或为 WCF 客户端提供替代方案尚未)。尽管如此,我们可以使用基于代码的方法来创建客户端代理并使用svcutil 来生成我们的服务引用类。
解决方案先决条件
对于此示例,我假设您在本地托管 http://localhost:5000/MapService.svc 的服务,该服务实现了 IMapService 合同。此外,我们将调用将包含服务代理的项目MapClient。
您的project.json 应该类似于:
{
"commands": {
"run": "run"
},
"frameworks": {
"dnx451": {
"dependencies": {
"Microsoft.AspNet.Mvc": "6.0.0-beta2"
},
"frameworkAssemblies": {
"System.ServiceModel": "4.0.0.0"
}
}
}
}
生成服务引用类
首先,让我们在MapClient 项目中创建一个文件夹Service References。
接下来,打开 VS2015 的开发人员命令提示符 并导航到您的 MapClient 项目目录:
cd "C:\Users\youraccount\Documents\Visual Studio 2015\Projects\MapClient\src\MapClient"
确保MapService 正在运行并运行以下命令:
svcutil /language:cs /out:"Service References\MapServiceReference.cs" http://localhost:5000/MapService.svc
这应该会生成两个文件,output.config 和 MapServiceReference.cs。
创建基于代码的客户端代理
由于无法自动将端点和绑定配置从配置文件映射到当前在 ASP.NET 5 中的 ClientBase,因此 output.config 对我们没有多大用处.你可以删除它。
相反,让我们在代码中创建一个客户端代理:
using System.ServiceModel;
namespace TestWCFReference
{
public class Program
{
public void Main(string[] args)
{
var endpointUrl = "http://localhost:5000/MapService.svc";
BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress endpoint = new EndpointAddress(endpointUrl);
ChannelFactory<IMapService> channelFactory = new ChannelFactory<IMapService>(binding, endpoint);
IMapService clientProxy = channelFactory.CreateChannel();
var map = clientProxy.GetMap();
channelFactory.Close();
}
}
}
现在您可以使用clientProxy 实例访问IMapService 中的任何操作合约。
作为旁注,创建一个 key:value 配置文件来存储您的绑定和端点配置并使用 Microsoft.Framework.ConfigurationModel.Configuration 对象填充您的 ChannelFactory 可能会更好的架构,这样您就可以将您的服务配置排除在外你的代码,但希望这个例子能让你开始。