在Visual Studio 2015预览版(预发布版)中,如何为WCF
服务添加服务引用?
答案 0 :(得分:41)
目前,这是一个相当复杂的过程,因为工具似乎不太支持生成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"
}
}
}
}
首先,让我们在Service References
项目中创建一个文件夹MapClient
。
接下来,打开 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
中的任何操作合同。
作为旁注,创建密钥可能是更好的架构:值配置文件,用于存储绑定和端点配置,并使用Microsoft.Framework.ConfigurationModel.Configuration
对象填充ChannelFactory
,以便您可以保留您的代码中的服务配置,但希望此示例可以帮助您入门。
答案 1 :(得分:9)
有一个新的Visual Studio扩展,允许您添加和使用以前版本中的服务引用。它也与新的CoreCLR兼容,我刚刚测试过它。
答案 2 :(得分:3)
目前没有可用的工具和可能的原因,这个System.ServiceModel在asp.netcore5中不可用。
如果你决定使用ASP.net 5,你现在可以做以下事情来使用WCF服务(我使用Visual Studio 2015 CTP 5来获得这个答案)
在VS 2015 CTP 5中,它允许我们添加常规类库的引用。
添加ClassLibrary作为ASP.net 5网站的参考。 (因为CoreCLR框架不支持System.Service模型所以我从project.json中删除了它。)project.json的框架部分。
"frameworks": {
"aspnet50": {
"frameworkAssemblies": {
"System.ServiceModel": ""
},
"dependencies": {
"ClassLibrary2": "1.0.0-*"
}
}
},
现在运行您的应用程序。
答案 3 :(得分:3)
编辑:添加其他答案中发布的已连接服务的新扩展程序仍然无效,但我找到了另一种工作配置,但它需要您不要使用dnxcore50 :
在project.json的“框架”部分中有服务模型和所需的序列化dll(需要删除dnxcore)
"dnx451": {
"dependencies": {
"YourClassLibWillAppearHere": "1.0.0-*" // after you reference it
},
"frameworkAssemblies": {
"System.ServiceModel": "4.0.0.0",
"System.ServiceModel.Http": "4.0.0.0",
"System.Runtime.Serialization": "4.0.0.0"
}
}
你应该能够在你需要的地方做到:
using YourNameSpace.ServiceReference
旧答案:
这对我有用:
我在此链接的已知问题for beta4 (在页面“WCF”中找到)同时提供了相同的说明:
https://github.com/aspnet/Home/releases
所以我的步骤:
复制了整个
<system.serviceModel>...
从 app.config 到 web.config
从 project.json 上面的链接中复制了所有缺少的依赖项列表,在常见的依赖项下,只留下特定的框架(尝试引用dotnet4.6类)作为aspnet框架依赖的库在该框架中提供了许多缺少的类型)
"dependencies": { >> here << }
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
答案 4 :(得分:3)
另一种对我有用的潜在方法是简单地将dll项目添加到解决方案中并像往常一样添加服务引用 - 在MVC项目中包含dll并参考服务。
您只需要将app.config的内容复制到mvc项目自己的app.config - 是,app.config,而不是web.config。
完成
答案 5 :(得分:1)
如果您在使用 .NET 5 添加 WCF 服务后遇到 System.ServiceModel。您可以删除 Assemblies System.Servicemodel 并使用 添加以下包>版本 4.4.4 。这对我有用。
System.ServiceModel.Duplex
System.ServiceModel.Http
System.ServiceModel.NetTcp
System.ServiceModel.Security