ASP.NET5 添加WCF服务引用

ASP.NET 5 add WCF service reference

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

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

如果您决定使用 ASP.net 5,您现在可以执行以下操作以使用 WCF 服务(我使用 Visual Studio 2015 CTP 5 来回答这个问题)

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

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

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

现在 运行 您的申请。

目前,这是一个相当复杂的过程,因为工具似乎不支持生成 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 是 运行ning 并且 运行 以下命令:

svcutil /language:cs /out:"Service References\MapServiceReference.cs" http://localhost:5000/MapService.svc

那应该生成两个文件,output.configMapServiceReference.cs

创建基于代码的客户端代理

由于无法自动 将配置文件中的端点和绑定配置映射到您目前在 ASP.NET 5 中的 ClientBaseoutput.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 可能是更好的架构您可以将服务配置保留在代码之外,但希望这个示例能帮助您入门。

编辑:其他答案中发布的用于添加连接服务的新扩展仍然对我不起作用,但我找到了另一个工作配置,尽管它需要 你不使用 dnxcore50:

  • 有一个 class 库保存服务引用(选择一个框架 <= aspnet5 使用的框架,例如 dnx451)
  • 通过右键单击引用将那个引用到你的 aspnet5 中(将创建所有包装材料)
  • 在 project.json 的 "framework" 部分有服务模型和需要的序列化 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" 页中找到)在 link 下提供的两个说明:

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

所以我的步骤是:

  1. 另一个项目添加了服务参考(建议使用class库或windows8.1 univ应用程序)
  2. 已将 参考 class 复制到 ASP.NET 5 项目
  3. 复制了整个

    <system.serviceModel>...

    app.configweb.config

  4. 复制了上面link中project.json中所有缺少的依赖项列表,在通用依赖项下,只留下特定框架那些(试图引用 dotnet4.6 class 库作为 aspnet 框架依赖项,在该框架中给出了许多缺失的类型

"dependencies": { >> here << }

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

有一个新的 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

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

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

完成

如果在 .NET 5 添加 WCF 服务后遇到 System.ServiceModel。您可以删除 Assemblies System.Servicemodel 并使用 version 4.4.4 添加以下包。这对我有用。

System.ServiceModel.Duplex
System.ServiceModel.Http
System.ServiceModel.NetTcp
System.ServiceModel.Security