ASP.NET 5 添加 WCF 服务参考

Posted

技术标签:

【中文标题】ASP.NET 5 添加 WCF 服务参考【英文标题】:ASP.NET 5 add WCF service reference 【发布时间】: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 中使用...未知。 【参考方案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 中,它允许我们添加常规类库的引用。

    创建 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 网站项目 (vnext) 的 wwwroot 文件夹中 将其重命名为 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

所以我的步骤在哪里

    服务参考添加到另一个项目(建议使用类库或 windows 8.1 univ 应用) 将引用类复制到 ASP.NET 5 项目中

    全部复制

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

    app.configweb.config

    从上面链接中的 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

【讨论】:

以上是关于ASP.NET 5 添加 WCF 服务参考的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务与 ASP.NET Web Api

带有 asp.net mvc 应用程序的 WCF 服务

ASP.NET MVC 和 WCF 服务安全 - 身份验证、路由

WCF 无法激活服务,因为它不支持 ASP.NET 兼容性

ASP.NET Ajax调用WCF服务示例

asp.net web 方法和 wcf 服务有啥区别?