ASP.NET 5添加WCF服务引用
在Visual Studio 2015预览版(预发行版)中,如何为WCF
服务添加服务引用?
目前,这是一个相当复杂的过程,因为工具似乎不太支持生成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的Developer Command Prompt并导航到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 channelFactory = new ChannelFactory (binding, endpoint); IMapService clientProxy = channelFactory.CreateChannel(); var map = clientProxy.GetMap(); channelFactory.Close(); } } }
现在,您可以使用IMapService
实例访问IMapService
任何操作契约。
作为旁注,创建密钥可能是更好的架构:值配置文件,用于存储绑定和端点配置,并使用Microsoft.Framework.ConfigurationModel.Configuration
对象填充您的ChannelFactory
以便您可以将服务配置保留在代码,但希望这个例子能让你开始。
有一个新的Visual Studio扩展,允许您添加和使用以前版本中的服务引用。 它也与新的CoreCLR兼容,我刚刚测试过它。
目前没有可用的工具和可能的原因,这个System.ServiceModel在asp.netcore5中不可用。
如果您决定使用ASP.net 5,那么您现在可以执行以下操作来使用WCF服务(我使用Visual Studio 2015 CTP 5来获得此答案)
在VS 2015 CTP 5中,它允许我们添加常规类库的引用。
- 创建WCF服务。
- 创建常规类库(我选择.NET Framework 4.6)
- 之后,我将WCF服务引用添加到ClassLibrary。
-
添加ClassLibrary作为ASP.net 5网站的参考。 (因为CoreCLR框架不支持System.Service模型所以我从project.json中删除了它)project.json的框架部分。
"frameworks": { "aspnet50": { "frameworkAssemblies": { "System.ServiceModel": "" }, "dependencies": { "ClassLibrary2": "1.0.0-*" } } },
- 现在,如果您查看classlibrary项目,它包含app.config文件。
- 复制该文件并将其放在ASP.net网站项目的wwwroot文件夹中(vnext)
- 将其重命名为web.config。
现在运行你的应用程序
编辑 :添加连接服务的新扩展程序在其他答案中发布仍然不适合我,但我找到了另一个工作配置,但它要求你不要使用dnxcore50 :
- 有一个包含服务引用的类库(选择一个框架<= aspnet5使用一个,例如dnx451)
- 通过右键单击引用将一个引用到您的aspnet5中(将创建所有包装内容)
-
在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
旧答案 :
这对我有用:
我在此链接上同时遵循了针对beta4 (在页面“WCF”中找到)的已知问题提供的说明:
https://github.com/aspnet/Home/releases
所以我的步骤在哪里 :
- 添加了对另一个项目的 服务引用 (类库或Windows 8.1 univ app,如建议的那样)
- 将引用类复制到ASP.NET 5项目
-
复制了整个
... 从app.config到web.config
-
在公共依赖项下,从project.json中的上面的链接中复制了所有那些缺少的依赖项列表,只留下了特定的框架( 尝试引用dotnet4.6类库作为aspnet框架依赖项,在该框架中提供了许多缺少的类型 )
"dependencies": { >> here << }
"frameworks": { "dnx451": { }, "dnxcore50": { } }
另一种对我有用的潜在方法是简单地将dll项目添加到解决方案中并像往常一样添加服务引用 – 在MVC项目中包含dll并为服务引用。
您只需将app.config的内容复制到mvc项目自己的app.config – 是,app.config,而不是web.config。
完成