接着上次的继续讲吧

我们开始吧

9.创建数据库

use master
go
--创建库
if exists(select * from sysdatabases where name='NewsDB')
drop database NewsDB
create database NewsDB
on primary
(
name='NewsDB_data',
filename='D:\NewsDB_data.mdf',
filegrowth=30%,
size=5
)log on
(
name='NewsDB_log',
filename='D:\NewsDB_log.ldf',
size=2,
filegrowth=10%
)
go
 
--创建表News
use NewsDB
go
if exists(select * from sysobjects where name='News')
drop table News
create table News(
  NewsID int identity(1,1) primary key,
  NewsTitle nvarchar(50) not null,
  Content nvarchar(max) not null,
  NewsType int not null,
  publishTime datetime not null,
  LastUpdateTime datetime not null,
  Author nvarchar(20) not null,
  LastAuthor nvarchar(20) not null,
  ReadCount int not null
)

10. 添加Linq to SQL文件

11. 实现服务

11.1 修改NewsTypeEnum枚举文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
 
namespace NewsInterface
{
    [DataContract]
    public enum NewsTypeEnum
    {
        [EnumMember]
        Sports=1,
        [EnumMember]
        IT=2,
        [EnumMember]
        Country=3,
        [EnumMember]
        Funny=4
    }
}

11.2 在D盘放一张 1.jpg图片作为测试用

1.jpg

11.3 打开NewsImpl.cs文件,实现服务

修改NewsDto,添加NewsID属性

NewsImpl.cs代码实现大致如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.ServiceModel;
using NewsInterface;
using System.IO;
 
namespace NewsServices
{
    public class NewsImpl:INewsInterface
    {
 
        public int NewsAdd(NewsDto dto)
        {
            Console.WriteLine("添加中...");
            using (NewsDataContext db=new NewsDataContext())
            {
                News news = new News();
                news.Author=dto.Author;
                news.Content=dto.Content;
                news.LastAuthor=dto.LastAuthor;
                news.LastUpdateTime=dto.LastUpdateTime;
                news.NewsType=dto.NewsType.GetHashCode();
                news.publishTime = dto.publishTime;
                news.ReadCount = dto.ReadCount;
                news.NewsTitle = dto.NewsTitle;
                db.News.InsertOnSubmit(news);
                db.SubmitChanges();
                Console.WriteLine("添加成功!");
                return news.NewsID;
            }
        }
 
        public bool NewsDelete(NewsDto dto)
        {
            Console.WriteLine("删除中...");
            using (NewsDataContext db = new NewsDataContext())
            {
                try
                {
                    News model = db.News.FirstOrDefault(x => x.NewsID == dto.NewsID);
                    db.News.DeleteOnSubmit(model);
                    db.SubmitChanges();
                    Console.WriteLine("删除成功");
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }
 
        public bool NewsUpdate(NewsDto dto)
        {
            throw new NotImplementedException();
        }
 
        public List<NewsDto> NewsList()
        {
            Console.WriteLine("请求获得新闻列表");
            using (NewsDataContext db = new NewsDataContext())
            {
                var d=from o in db.News
                        select new NewsDto
                        {
                            Author=o.Author,
                            LastAuthor=o.LastAuthor,
                            LastUpdateTime=o.LastUpdateTime,
                            NewsID=o.NewsID,
                            Content=o.Content,
                            NewsTitle=o.NewsTitle,
                            publishTime=o.publishTime,
                            ReadCount=o.ReadCount
                        };
                return d.ToList<NewsDto>();
            }
        }
 
        public byte[] GetNewsImage(string Id)
        {
            Console.WriteLine("开始获得图片:"+Id+"...");
            byte[] buff;
            string path = @"D:\1.jpg";
            FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fileStream);
            buff = br.ReadBytes((int)fileStream.Length);
            Console.WriteLine("获取成功!");
            return buff;
        }
    }
}

这里修改我没有去实现,感兴趣自己可以实现

LINQ to SQL如果不会的,可以 点击学习  那天有个小孩跟我说LINQ

11.4 重新生成解决方案,编译程序

12.  公开元数据

现在可以通过添加配置来托管服务了,并公开元数据。公开元数据之后,Visual Studio就可以下载WSDL文件,创建所需要的代理了。我们后期会教大家创建代理的其他方式

现在用WCF配置编辑器打开NewsHosts应用程序的配置文件App.config

新建服务行为的名称      ExposeMetaDataBehavior

元数据发布地址   http://localhost:1234/NewsService/Mex

下面具体配置一下

配置完成后App.config

配置成功后,将HOST设为启动项目,运行项目,打开浏览器输入

http://localhost:1234/NewsService/Mex

效果如果是这样子的,说明 成功的

13. 创建 NewsApplication客户端,我们使用Winform

窗体,我改成这样子了,上面的蓝色文字用于说明

最重要的一步,添加服务

先不用VS运行宿主

我们手动打开Debug文件夹下的 NewsHosts.exe

接下来看我演示一下

我们最后注释掉 identity节点,是为了方便测试

14 实现Winform后面的方法

14.1 添加

     private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                NewsService.NewsInterfaceClient client = new NewsService.NewsInterfaceClient();
                NewsService.NewsDto dto = new NewsService.NewsDto();
                dto.Author = "杨洋";
                dto.LastAuthor = "AaronYang";
                dto.publishTime = DateTime.Now;
                dto.LastUpdateTime = DateTime.Now;
                dto.NewsTitle = "测试标题:" + new Random().Next(10000).ToString();
                dto.Content = "测试内容" + new Random().Next(10000).ToString();
                dto.NewsType = NewsService.NewsTypeEnum.Country;
                dto.ReadCount = 0;
                MessageBox.Show("添加成功!成功后的ID为"+client.NewsAdd(dto).ToString());
            }
            catch (Exception ex)
            {
                richTextBox1.Text += Environment.NewLine + ex.Message;
            }
        }

14.2 获得新闻列表

      private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                NewsService.NewsInterfaceClient client = new NewsService.NewsInterfaceClient();
                List<NewsService.NewsDto> list = client.NewsList();
                foreach (NewsService.NewsDto item in list)
                {
                    listBox1.Items.Add("标题:"+item.NewsTitle+"\t发布时间:"+item.publishTime.ToShortDateString());
                 }
            }
            catch (Exception ex)
            {
                richTextBox1.Text += Environment.NewLine + ex.Message;
            }
            
 
        }

14.3 获得图片并显示

    private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                NewsService.NewsInterfaceClient client = new NewsService.NewsInterfaceClient();
                byte[] buff=client.GetNewsImage("1");
                TypeConverter converter = TypeDescriptor.GetConverter(typeof(Bitmap));
                Bitmap bitmap = (Bitmap)converter.ConvertFrom(buff);
                pictureBox1.Image = bitmap;
            }
            catch (Exception ex)
            {
                richTextBox1.Text += Environment.NewLine + ex.Message;
            }
        }

14.4 有的图片可能过大,可能响应的时候图片太大就不能显示了,我们需要修改宿主的WCF的配置

我们配置一下终结点(Endpoint)的绑定配置,名称就是 上面的<binding name=”这里的名字”>

我们还需要修改客户端的配置,使它可以接受超大的消息

打开NewsApplication的app.config文件

15.设置两个启动项目,运行查看效果

先生成解决方案,然后我们设置一下

效果图:

关于 获得列表,还有点问题

下次调,我再解决一下

关于NewsDto中我最后不是添加了一个NewsID吗,我没有添加DataMember属性,但是添加上去,似乎还是没有用,有人知道怎么解决吗

我把代码上传一下了,希望有人能棒棒我,感谢万分。        代码下载

这个是错误信息

接收对 http://localhost:1234/NewsMgr 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。

时间不早了,我先睡觉了,大家晚安

那天有个小孩教我WCF[一][2/3]的更多相关文章

  1. 那天有个小孩教我WCF[一][1/3]

    那天有个小孩教我WCF[一][1/3] 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不细讲,步步教你创建一个简单SOA案例,对WCF有个基本的认识,我不 ...

  2. (转)那天有个小孩教我WCF[一][1/3]

    原文地址:http://www.cnblogs.com/AaronYang/p/2950931.html 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不 ...

  3. WCF系列教程之WCF服务协定

    本文参考自:http://www.cnblogs.com/wangweimutou/p/4422883.html,纯属读书笔记,加深记忆 一.服务协定简介: 1.WCF所有的服务协定层里面的服务接口, ...

  4. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  5. 那天有个小孩跟我说LINQ(五)转载

    2  LINQ TO SQL(代码下载)      我们以一个简单的销售的业务数据库为例子         表结构很简单:Users(购买者(用户)表),Products(产品信息表),Sales(销 ...

  6. WCF系列教程之WCF服务配置工具

    本文参考自http://www.cnblogs.com/wangweimutou/p/4367905.html Visual studio 针对服务配置提供了一个可视化的配置界面(Microsoft ...

  7. WCF系列教程之WCF实例化

    本文参考自http://www.cnblogs.com/wangweimutou/p/4517951.html,纯属读书笔记,加深记忆 一.理解WCF实例化机制 1.WCF实例化,是指对用户定义的服务 ...

  8. WCF系列教程之WCF中的会话

    本文参考自http://www.cnblogs.com/wangweimutou/p/4516224.html,纯属读书笔记,加深记忆 一.WCF会话简介 1.在WCF应用程序中,回话将一组消息相互关 ...

  9. WCF系列教程之WCF客户端异常处理

    本文参考自:http://www.cnblogs.com/wangweimutou/p/4414393.html,纯属读书笔记,加深记忆 一.简介 当我们打开WCF基础客户通道,无论是显示打开还是通过 ...

随机推荐

  1. HDU 1711Number Sequence【KMP模板题】

    <题目链接> 题目大意: 意思是给出两个串,找出匹配串在模式串中的位置. 解题分析: KMP算法模板题. #include <cstdio> #include <cstr ...

  2. P3719 [AHOI2017初中组]rexp

    P3719 [AHOI2017初中组]rexp一开始想的是类似计算式子的值的东西,用栈.然后发现处理最大值很麻烦,因为处理的很像子过程,所以考虑递归来做.碰到'('就递归一次,碰到'|'就取最大值再递 ...

  3. Angular 个人深究(五)【外部包引用 Leaflet 简单实用】

    Leaflet 使用 最近在Angular项目中,用到了地图,由于种种原因放弃了百度地图api使用,最后选择了leaflet,简单介绍一下. 介绍: Leaflet 是一个为移动设备设计的交互式地图的 ...

  4. JAVA Socket通信 打造属于自己的网盘

    近一个月没敲JAVA代码了,最近老师布置了一个写JAVA网盘的作业,总共花了十几个小时,总算写完了,debug真的累,感觉自己还是菜了,没有那种有一个想法就能马上用代码实现的能力....不扯了,下面开 ...

  5. 多线程出现 java.lang.NumberFormatException: multiple points

    多线程下导入数据,发现同一个文件每次导入成功的数据量都不一致,经检查,某些数据偶尔会报错  java.lang.NumberFormatException: multiple points 原因是导入 ...

  6. Scratch儿童项目式编程—捉迷藏游戏 Scratch children project programming - hide-and-seek game

    Scratch儿童项目式编程—捉迷藏游戏 Scratch children project programming - hide-and-seek game 作者:韩梦飞沙 Author:han_me ...

  7. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  8. oracle 列相减——(Oracle分析函数Lead(),Lag())

    lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合 其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是 ...

  9. 关闭Ubuntu桌面版GUI

    个人用于实验的Ubuntu虚拟机不需要GUI,且要复制多个,但是又懒得重新装个Ubuntu,打算把现有的带桌面的直接装好克隆起来用,但是多个GUI一起开电脑吃不消,思前想后找了下关闭GUI的方法如下: ...

  10. Qt.Qt新安装之后出现Error while building/deploying (kit: Desktop Qt 5.7.0 GCC 64bit) When executing step "Make”

    出问题的环境: 操作系统: Ubuntu18.04 安装包: qt-opensource-linux-x64-5.8.0.run 现象: 新建一个Hello World项目, 试着运行, 出现以下提示 ...