.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



相关文章
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
655 10
|
5月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
7月前
|
中间件 Go
Golang | Gin:net/http与Gin启动web服务的简单比较
总的来说,`net/http`和 `Gin`都是优秀的库,它们各有优缺点。你应该根据你的需求和经验来选择最适合你的工具。希望这个比较可以帮助你做出决策。
337 35
|
5月前
|
存储 缓存
.NET 6中Startup.cs文件注入本地缓存策略与服务生命周期管理实践:AddTransient, AddScoped, AddSingleton。
记住,选择正确的服务生命周期并妥善管理它们是至关重要的,因为它们直接影响你的应用程序的性能和行为。就像一个成功的建筑工地,工具箱如果整理得当,工具选择和使用得当,工地的整体效率将会大大提高。
229 0
|
11月前
|
前端开发 C# 开发者
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
184 12
|
11月前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
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 部署等内容。
683 6
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
254 9
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
287 1
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
974 0