【问题标题】:ASP.NET 5 add WCF service referenceASP.NET 5 添加 WCF 服务参考
【发布时间】:2015-04-09 10:16:03
【问题描述】:

在 Visual Studio 2015 Preview(Pre Release)中,如何为 WCF 服务添加服务引用?

【问题讨论】:

  • 我认为你是对的 :( 我已经更新了我的答案以包含 VS 的版本。
  • 好消息! WCF 现在可以在 .NET Core 上使用,并且可以在 ASP.NET 5 下访问。dotnetfoundation.org/blog/wcf-is-open-source 现在..该工具何时可以在 Visual Studio 中使用...未知。

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


【解决方案1】:

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

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 中的任何操作合约。

作为旁注,创建一个 key:value 配置文件来存储您的绑定和端点配置并使用 Microsoft.Framework.ConfigurationModel.Configuration 对象填充您的 ChannelFactory 可能会更好的架构,这样您就可以将您的服务配置排除在外你的代码,但希望这个例子能让你开始。

【讨论】:

  • 我有一堆“严重性代码描述项目文件行错误 CS0234 类型或命名空间名称“ServiceContractAttribute”在命名空间“System.ServiceModel”中不存在(您是否缺少程序集引用? ) MyProject.Web.DNX 4.5.1 C:\dev\MyProjectLibrary\MyProject.Web\Service References\EditUsersReference.cs 397",知道为什么吗?
  • 我不确定我能提供多少帮助,因为我目前不在 m$ 堆栈上。你能在 Visual Studio @Lomithrani 之外编译和运行吗?
  • 你可以试试这个方法。我只是在为一个新项目测试它。 blogs.msdn.microsoft.com/webdev/2016/05/25/…
【解决方案2】:

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

【讨论】:

  • 感谢您的贡献。
【解决方案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。

现在运行您的应用程序。

【讨论】:

  • 我只能引用 .net 5 库正常吗?我读到现在 wcf 已移植到 .net 5,但如何在我的 mvc 6 项目中引用它?
【解决方案4】:

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

  • 拥有一个包含服务引用的类库(选择一个框架
  • 通过右键单击引用将其引用到您的 aspnet5 中(将创建所有包装内容)
  • project.json的“framework”部分有Service模型和需要的序列化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 应用)
  2. 引用类复制到 ASP.NET 5 项目中
  3. 全部复制

    &lt;system.serviceModel&gt;...

    app.configweb.config

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

"dependencies": { &gt;&gt; here &lt;&lt; }

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

【讨论】:

    【解决方案5】:

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

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

    完成

    【讨论】:

    • 谢谢!这对我来说是完美的。
    • 不是噩梦!
    • 是的:)。我正在将一个项目移植到 ASP.Core,但使用 .Net Framework 4.6.1,如果不是 .Net Framework Core,则扩展工具不可用
    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多