WCF快速上手(二)

一、代码结构:

二、服务接口Contract和实体类Domain

INoticeService:

using Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace Contract
{
    /// <summary>
    /// 通知公告
    /// </summary>
    [ServiceContract]
    public interface INoticeService
    {
        /// <summary>
        /// 获取一条公告信息
        /// </summary>
        [OperationContract]
        Notice GetNotice();
    }
}

Notice:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Domain
{
    /// <summary>
    /// 通知公告
    /// </summary>
    public class Notice
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string Title { get; set; }
        /// <summary>
        /// 内容
        /// </summary>
        public string Content { get; set; }
        /// <summary>
        /// 数据
        /// </summary>
        public byte[] Data { get; set; }
    }
}

三、服务WcfService和宿主WcfHost

NoticeService:

using Contract;
using Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WcfService
{
    /// <summary>
    /// 通知公告服务
    /// </summary>
    public class NoticeService : INoticeService
    {
        /// <summary>
        /// 获取一条公告信息
        /// </summary>
        public Notice GetNotice()
        {
            Notice notice = new Notice();
            notice.Title = "测试标题";
            notice.Content = "测试内容";
            notice.Data = new byte[200000];
            for (int i = 0; i < 200000; i++)
            {
                notice.Data[i] = (byte)100;
            }
            return notice;
        }
    }
}

Program:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using WcfService;

namespace WcfServer
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + "Service";
            string[] fileArr = Directory.GetFiles(path);
            int port = int.Parse(ConfigurationManager.AppSettings["ServerPort"]);

            foreach (string fileName in fileArr)
            {
                string url = string.Format("http://localhost:{0}/Service/{1}", port, Path.GetFileName(fileName));
                Uri[] uri = new Uri[] { new Uri(url) };

                ServiceHost host = new ServiceHost(typeof(NoticeService), uri);
                host.Open();
            }

            Console.WriteLine("服务成功启动");
            Console.Read();
        }
    }
}

服务端App.config配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="ServerPort" value="8998"/>
  </appSettings>
  <system.serviceModel>
    <services>
      <service name="WcfService.NoticeService" behaviorConfiguration="ServiceBehavior" >
        <endpoint  contract="Contract.INoticeService" address="" binding="basicHttpBinding" bindingConfiguration="ServiceBinding">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="ServiceBinding" sendTimeout="00:00:20" maxReceivedMessageSize="2147483646">
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

四、客户端

NoticeProxy:

using Contract;
using Domain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace WcfClient
{
    /// <summary>
    /// 通知公告
    /// </summary>
    public class NoticeProxy : INoticeService
    {
        private ChannelFactory<INoticeService> channelFactory;
        private INoticeService server;

        public NoticeProxy()
        {
            channelFactory = new ChannelFactory<INoticeService>("NoticeService");
            server = channelFactory.CreateChannel();
        }

        /// <summary>
        /// 获取一条公告信息
        /// </summary>
        public Notice GetNotice()
        {
            return server.GetNotice();
        }
    }
}

客户端调用服务:

using Domain;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WcfClient;

namespace WinformClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            try
            {
                NoticeProxy proxy = new NoticeProxy();
                Notice notice = proxy.GetNotice();
                MessageBox.Show(notice.Data.Length.ToString());
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

客户端App.config配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="ServiceBehavior">
          <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="ServiceBinding"  maxReceivedMessageSize="2147483646">
          <readerQuotas maxArrayLength="65242880" maxStringContentLength="65242880"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint name="NoticeService" contract="Contract.INoticeService"  address="http://localhost:8998/Service/NoticeService.svc" behaviorConfiguration="ServiceBehavior"  binding="basicHttpBinding" bindingConfiguration="ServiceBinding" />
    </client>
  </system.serviceModel>
</configuration>

时间: 2024-11-19 02:28:34

WCF快速上手(二)的相关文章

python爬虫框架之scrapy的快速上手 二

scrapy快速上手之crawl模板 前面提到过,我们使用了basic作为模板生成了爬虫 现在介绍另外一种模板:crawl 创建项目 首先在命令行界面执行: scrapy startproject Spider 后,即可得到提示 You can start your first spider with: cd Spider scrapy genspider example example.com 然后,根据提示在命令继续输入cd Spider 这样,我们就来到了所创建爬虫的工作目录下 前面已经介

WCF快速上手

需求:在同一台机子上,有一个B/S程序,和一个C/S程序(不要问为什么,事实就是这样),B/S程序需要主动和C/S程序通信(C/S程序主动与B/S程序通信的情况这里暂不讨论). 下面以最快的速度写一个B/S程序和一个C/S程序实现,具体细节不解释,自己翻书看去. 一.建了两个工程,如下图所示: 二.先看C/S程序,跑起来就是这样的,如下图所示(简单吧): 程序结构如下图: WCF的接口WCFServer.数据结构DataStruct.Winform程序Client IClientServer:

android快速上手(二)android开发环境搭建及hello world

基本了解了java语法,下一步,我们一起开启hello world的神秘之旅. (一)android开发环境搭建 之前搭建android开发环境是件非常费力的事情,下载Eclipse,安装ADT等,如今android官方给我们提供了全套配置. https://developer.android.com/sdk/index.html 搭建android开发环境之前记得先安装jdk (二)开启Hello World之旅 (1)创建Hello World项目 安装完带ADT的Eclipse,打开Ecl

Netron开发快速上手(二):Netron序列化

Netron是一个C#开源图形库,可以帮助开发人员开发出类似Visio的作图软件.本文继前文”Netron开发快速上手(一)“讨论如何利用Netron里的序列化功能快速保存自己开发的图形对象. 一个用Netron开发的实际应用请看:发布一个免费开源软件-- PAD流程图绘制软件PADFlowChart 一.      Netron对象序列化 序列化Netron对象需要以下几个步骤: 添加序列化标签]Serializable] [Serializable] public class BlockSh

SpringBoot快速上手——《二》:SpringBoot集成SSM,实现增删改查功能

SpringBoot集成SSM,实现增删改查功能 github源码:https://github.com/xivinChen/SpringBoot 一.先介绍创建模块的另一种方式 1.点击Maven -> 勾选Create from archetype -> 选择 maven-archetype-quickstart 有时会需要点击 自动导入 2.工程目录 可以看到,这样创建的模块是相对干净的,需要我们手动的编写程序启动入口类.需要配置时还得创建配置文件.下一步见证. 3.完善模块 添加依赖,

UnityShader快速上手指南(二)

简介 前一篇介绍了如果编写最基本的shader,接下来本文将会简单的深入一下,我们先来看下效果吧 呃,gif效果不好,实际效果是很平滑的动态过渡 实现思路 1.首先我们要实现一个彩色方块 2.让色彩动起来 over 实现一个RGB CUBE 先看代码吧: Shader "LT/Lesson2" { Properties { _OffsetX ("Offset X", Range (-1.5, 1.5) ) = 0 _OffsetY ("Offset Y&q

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

Power BI教程_Power BI数据分析快速上手及案例实战

Power BI数据分析快速上手及案例实战 课程学习地址:http://www.xuetuwuyou.com/course/194 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本课程在<Power BI 数据分析快速上手>基础上结合大量的实例,深入讲解PowerBI中看似难懂的各种概念.操作, 并结合行业中的典型案例贯穿了从初级的数据透视表工具.数据透视表选项.数据透视表的刷新.数据透视表中的排序,到中级的动 态数据透视表的创建.数据透视表函数 GETPI

android快速上手(三)常用控件使用

完成了android的第一个程序HelloWorld,下面就开始控件的学习,下面是一些常见的控件. (一)TextView 简单的文本描述 (二)EditText 编辑框,输入文字信息 (三)Button 按钮,点击后会触发点击事件,可以对事件进行处理 (四)ImageView 图片控件,可以加载图片显示 (五)ListView 列表,需要跟适配器Adapter结合,适配器提供数据 (六)Toast 闪现提示语,常用于普通的提示文本,只显示一小段时间自动消失 (七)ScrollView 一般用于