.Net中使用WCF构建简单的基于B/S和C/S的服务

简介: 第1步:创建接口 namespace WCF.Interface{ //[ServiceContract(CallbackContract=typeof(ICallback))]//回调接口(全双工) [ServiceCo...

第1步:创建接口

namespace WCF.Interface
{
    //[ServiceContract(CallbackContract=typeof(ICallback))]//回调接口(全双工)
    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double x, double y);
    }
}

第2步:实现接口服务

namespace WCF.Service
{
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class Calculator : ICalculator
    {
        #region ICalculator Members

        public double Add(double x, double y)
        {
            
            double result = x + y;
            #region 全双工回调
            //ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            //callback.DisplayResult(x, y, result); 
            #endregion
            return result;
        }

        #endregion
    }
}

第3步:建立WinForm服务端

        #region 通过代码直接定义和开启服务
        /// <summary>
        /// 通过代码直接定义和开启服务(在启动之前必须把相应的配置文件注释或删除)
        /// </summary>
        private void HostCalculatorServiceViaCode()
        {
            try
            {
                Uri httpBaseAddress = new Uri("http://localhost:8888/Calculator");//1、基于http
                Uri tcpBaseAddress = new Uri("net.tcp://localhost:9999/Calculator");//2、基于tcp

                calculatorSerivceHost = new ServiceHost(typeof(Calculator), httpBaseAddress, tcpBaseAddress);

                BasicHttpBinding httpBinding = new BasicHttpBinding();
                NetTcpBinding tcpBinding = new NetTcpBinding();
                Type type1 = typeof(ICalculator);
                calculatorSerivceHost.AddServiceEndpoint(type1, httpBinding, "");
                calculatorSerivceHost.AddServiceEndpoint(type1, tcpBinding, "");

                ServiceMetadataBehavior behavior = calculatorSerivceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();

                if (behavior == null)
                {
                    behavior = new ServiceMetadataBehavior();
                    behavior.HttpGetEnabled = true;
                    calculatorSerivceHost.Description.Behaviors.Add(behavior);
                }
                else
                {
                    behavior.HttpGetEnabled = true;
                }

                calculatorSerivceHost.Opened += delegate
                {
                    txt_info.AppendText("Calculator server has begain to listen ...使用cmd命令 netstat -aon|findstr \"9999\" 查看 ...\r\n");
                };

                calculatorSerivceHost.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("详细信息:" + ex.Message,"出错提示,请确保参数配置正确且端口不被占用!",  MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

第4步:建立Web服务端

namespace WCF.WebServer
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Calculator”。
    /// <summary>
    /// wcf服务应用程序,测试时端口为 7777 并启动服务网站
    /// 继承于Service.Calculator,不用写额外代码直接调用
    /// </summary>
    public class Calculator :WCF.Service.Calculator
    {
    }
}



第5步:调用WinForm和Web服务端显示结果

private void InvocateCalclatorServiceViaCode()
        {
            System.ServiceModel.Channels.Binding httpBinding = new BasicHttpBinding();
            System.ServiceModel.Channels.Binding tcpBinding = new NetTcpBinding();

            EndpointAddress httpAddress = new EndpointAddress("http://localhost:8888/Calculator");//WinForm基于http的通道
            EndpointAddress tcpAddress = new EndpointAddress("net.tcp://localhost:9999/Calculator");//WinForm基于tcp的通道
            EndpointAddress webhttpAddress = new EndpointAddress("http://localhost:7777/Calculator.svc");//Web服务

            txt_info.AppendText("\r\nInvocate self-host calculator service... ...");

            #region Invocate Self-host service
            CalculatorClient calculator_http = new CalculatorClient(httpBinding, httpAddress);
            CalculatorClient calculator_webhttp = new CalculatorClient(httpBinding, webhttpAddress);
            CalculatorClient calculator_tcp = new CalculatorClient(tcpBinding, tcpAddress);

            try
            {
                txt_info.AppendText("\r\nBegin to invocate calculator service via http transport... ...");
                txt_info.AppendText(string.Format("\r\nx + y = {2} where x = {0} and y = {1}", 1, 2, calculator_http.Add(1, 2)));

                txt_info.AppendText("\r\nBegin to invocate calculator service via tcp transport... ...");
                txt_info.AppendText(string.Format("\r\nx + y = {2} where x = {0} and y = {1}", 1, 2, calculator_tcp.Add(1, 2)));
                
                txt_info.AppendText("\r\nBegin to invocate calculator service via webhttp transport... ...");
                txt_info.AppendText(string.Format("\r\nx + y = {2} where x = {0} and y = {1}", 1, 2, calculator_webhttp.Add(1, 2)));
            }
            catch (Exception ex)
            {
                txt_info.AppendText(Environment.NewLine + ex.Message);
            }
            finally
            {
                calculator_http.Close();
                calculator_tcp.Close();
            }

            #endregion



            #region Invocate IIS-host service
            //txt_info.AppendText("\r\nInvocate IIS-host calculator service... ...");
            //EndpointAddress httpAddress_iisHost = new EndpointAddress("http://localhost/wcfservice/CalculatorService.svc");
            //using (CalculatorClient calculator = new CalculatorClient(httpBinding, httpAddress_iisHost))
            //{
            //    try
            //    {
            //        txt_info.AppendText("\r\nBegin to invocate calculator service via http transport... ...");
            //        txt_info.AppendText(string.Format("\r\nx + y = {2} where x = {0} and y = {1}", 1, 2, calculator.Add(1, 2)));
            //    }
            //    catch (Exception ex)
            //    {
            //        txt_info.AppendText("\r\n"+ex.Message);
            //    }
            //}
            #endregion
        }



运行效果:

如果没有运行web服务,那么web调用将出错:




测试源码:WCF服务器与客户端使用示例文件v0.2(包含全双工模式和调用web中的wcf服务).zip



相关文章
|
2月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
133 10
|
14天前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
40 5
|
1月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
24 1
|
1月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
96 9
|
3月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
56 5
|
3月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
174 0
|
3月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
41 0
|
3月前
|
微服务 API Java
微服务架构大揭秘!Play Framework如何助力构建松耦合系统?一场技术革命即将上演!
【8月更文挑战第31天】互联网技术飞速发展,微服务架构成为企业级应用主流。微服务将单一应用拆分成多个小服务,通过轻量级通信机制交互。高性能Java Web框架Play Framework具备轻量级、易扩展特性,适合构建微服务。本文探讨使用Play Framework构建松耦合微服务系统的方法。Play采用响应式编程模型,支持模块化开发,提供丰富生态系统,便于快速构建功能完善的微服务。
49 0
|
3月前
|
SQL 开发框架 .NET
代码更简洁,开发更高效:从零开始使用Entity Framework Core与传统ADO.NET构建数据持久化层的比较
【8月更文挑战第31天】在.NET平台上开发数据驱动应用时,选择合适的ORM框架至关重要。本文通过对比传统的ADO.NET和现代的Entity Framework Core (EF Core),展示了如何从零开始构建数据持久化层。ADO.NET虽强大灵活,但需要大量手写代码;EF Core则简化了数据访问,支持LINQ查询,自动生成SQL命令,提升开发效率。从创建.NET Core项目、定义数据模型、配置`DbContext`到执行数据库操作,EF Core提供了一套流畅的API,使数据持久化层的构建变得简单直接。
40 0
|
3月前
|
传感器 开发框架 物联网
揭开.NET在IoT领域的神秘面纱:如何构建智能设备,让未来生活触手可及?
【8月更文挑战第28天】随着物联网技术的发展,智能设备正深入我们的生活。.NET作为跨平台开源框架,在IoT领域应用广泛。本文介绍如何利用.NET构建智能设备,通过实例展示从环境搭建到项目创建、代码编写及运行的全过程,帮助开发者快速实现IoT解决方案,开启智能设备开发的新篇章。
70 0
下一篇
无影云桌面