ASP.NET 5添加WCF服务引用

时间:2015-02-09 15:53:23

标签: c# asp.net wcf asp.net-core visual-studio-2015

在Visual Studio 2015预览版(预发布版)中,如何为WCF服务添加服务引用?

6 个答案:

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

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

答案 2 :(得分:3)

目前没有可用的工具和可能的原因,这个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网站项目(vnext)的wwwroot文件夹中
  7. 将其重命名为web.config。
  8. 现在运行您的应用程序。

答案 3 :(得分:3)

编辑:添加其他答案中发布的已连接服务的新扩展程序仍然无效,但我找到了另一种工作配置,但它需要您不要使用dnxcore50

  • 拥有一个包含服务引用的类库(选择一个框架&lt; = 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

旧答案

这对我有用:

我在此链接的已知问题for beta4 (在页面“WCF”中找到)同时提供了相同的说明:

https://github.com/aspnet/Home/releases

所以我的步骤

  1. 服务参考添加到另一个项目(类库或Windows 8.1 univ应用程序建议)
  2. 引用类复制到ASP.NET 5项目
  3. 复制了整个

    <system.serviceModel>...

    app.config web.config

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

  5. "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