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 库的引用。
- 创建 WCF 服务。
- 创建常规 Class 库(我选择 .NET Framework 4.6)
- 之后,我将 WCF 服务引用添加到 Class库。
添加 Class 库作为对 ASP.net 5 网站的引用。
(由于 CoreCLR 框架不支持 System.Service 模型,所以我从 project.json 中删除了它)project.json 的框架部分。
"frameworks": {
"aspnet50": {
"frameworkAssemblies": {
"System.ServiceModel": ""
},
"dependencies": {
"ClassLibrary2": "1.0.0-*"
}
}
},
- 现在,如果您查看 class 库项目,它包含 app.config 文件。
- 复制该文件并将其放入 ASP.net 网站项目 (vnext)
的 wwwroot 文件夹中
- 将其重命名为 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.config
和 MapServiceReference.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
可能是更好的架构您可以将服务配置保留在代码之外,但希望这个示例能帮助您入门。
编辑:其他答案中发布的用于添加连接服务的新扩展仍然对我不起作用,但我找到了另一个工作配置,尽管它需要 你不使用 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
所以我的步骤是:
- 向另一个项目添加了服务参考(建议使用class库或windows8.1 univ应用程序)
- 已将 参考 class 复制到 ASP.NET 5 项目
复制了整个
<system.serviceModel>...
从app.config到web.config
复制了上面link中project.json中所有缺少的依赖项列表,在通用依赖项下,只留下特定框架那些(试图引用 dotnet4.6 class 库作为 aspnet 框架依赖项,在该框架中给出了许多缺失的类型)
"dependencies": { >> here << }
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
有一个新的 Visual Studio 扩展,允许您像以前的版本一样添加和使用服务引用。它还兼容新的CoreCLR,我刚刚测试过。
另一种对我有用的潜在方法是简单地将一个 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
在 Visual Studio 2015 预览版(预发布版)中,如何为 WCF
服务添加服务引用?
目前没有可用的工具和可能的原因 System.ServiceModel asp.netcore5 中不可用。
如果您决定使用 ASP.net 5,您现在可以执行以下操作以使用 WCF 服务(我使用 Visual Studio 2015 CTP 5 来回答这个问题)
在 VS 2015 CTP 5 中,它允许我们添加常规 class 库的引用。
- 创建 WCF 服务。
- 创建常规 Class 库(我选择 .NET Framework 4.6)
- 之后,我将 WCF 服务引用添加到 Class库。
添加 Class 库作为对 ASP.net 5 网站的引用。 (由于 CoreCLR 框架不支持 System.Service 模型,所以我从 project.json 中删除了它)project.json 的框架部分。
"frameworks": { "aspnet50": { "frameworkAssemblies": { "System.ServiceModel": "" }, "dependencies": { "ClassLibrary2": "1.0.0-*" } } },
- 现在,如果您查看 class 库项目,它包含 app.config 文件。
- 复制该文件并将其放入 ASP.net 网站项目 (vnext) 的 wwwroot 文件夹中
- 将其重命名为 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.config
和 MapServiceReference.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
可能是更好的架构您可以将服务配置保留在代码之外,但希望这个示例能帮助您入门。
编辑:其他答案中发布的用于添加连接服务的新扩展仍然对我不起作用,但我找到了另一个工作配置,尽管它需要 你不使用 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
所以我的步骤是:
- 向另一个项目添加了服务参考(建议使用class库或windows8.1 univ应用程序)
- 已将 参考 class 复制到 ASP.NET 5 项目
复制了整个
<system.serviceModel>...
从app.config到web.config
复制了上面link中project.json中所有缺少的依赖项列表,在通用依赖项下,只留下特定框架那些(试图引用 dotnet4.6 class 库作为 aspnet 框架依赖项,在该框架中给出了许多缺失的类型)
"dependencies": { >> here << }
"frameworks": {
"dnx451": { },
"dnxcore50": { }
}
有一个新的 Visual Studio 扩展,允许您像以前的版本一样添加和使用服务引用。它还兼容新的CoreCLR,我刚刚测试过。
另一种对我有用的潜在方法是简单地将一个 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