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.configMapServiceReference.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兼容,我刚刚测试过它。

http://blogs.msdn.com/b/webdev/archive/2015/12/15/wcf-connected-service-visual-studio-extension-preview-for-asp-net-5-projects.aspx

目前没有可用的工具和可能的原因,这个System.ServiceModel在asp.netcore5中不可用。

如果您决定使用ASP.net 5,那么您现在可以执行以下操作来使用WCF服务(我使用Visual Studio 2015 CTP 5来获得此答案)

在VS 2015 CTP 5中,它允许我们添加常规类库的引用。

  1. 创建WCF服务。
  2. 创建常规类库(我选择.NET Framework 4.6)
  3. 之后,我将WCF服务引用添加到ClassLibrary。
  4. 添加ClassLibrary作为ASP.net 5网站的参考。 (因为CoreCLR框架不支持System.Service模型所以我从project.json中删除了它)project.json的框架部分。

     "frameworks": { "aspnet50": { "frameworkAssemblies": { "System.ServiceModel": "" }, "dependencies": { "ClassLibrary2": "1.0.0-*" } } }, 
  5. 现在,如果您查看classlibrary项目,它包含app.config文件。
  6. 复制该文件并将其放在ASP.net网站项目的wwwroot文件夹中(vnext)
  7. 将其重命名为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

所以我的步骤在哪里

  1. 添加了对另一个项目的 服务引用 (类库或Windows 8.1 univ app,如建议的那样)
  2. 引用类复制到ASP.NET 5项目
  3. 复制了整个

    ...

    app.configweb.config

  4. 在公共依赖项下,从project.json中的上面的链接中复制了所有那些缺少的依赖项列表,只留下了特定的框架( 尝试引用dotnet4.6类库作为aspnet框架依赖项,在该框架中提供了许多缺少的类型

"dependencies": { >> here << }

 "frameworks": { "dnx451": { }, "dnxcore50": { } } 

另一种对我有用的潜在方法是简单地将dll项目添加到解决方案中并像往常一样添加服务引用 – 在MVC项目中包含dll并为服务引用。

您只需将app.config的内容复制到mvc项目自己的app.config – 是,app.config,而不是web.config。

完成