那天有個小孩教我WCF[一][2/3]


接着上次的繼續講吧

我們開始吧

 

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圖片作為測試用

11.jpg

 

11.3 打開NewsImpl.cs文件,實現服務

修改NewsDto,添加NewsID屬性

image

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

   image

新建服務行為的名稱      ExposeMetaDataBehavior

元數據發布地址   http://localhost:1234/NewsService/Mex

下面具體配置一下

22

配置完成后App.config

image

配置成功后,將HOST設為啟動項目,運行項目,打開瀏覽器輸入

http://localhost:1234/NewsService/Mex

image

效果如果是這樣子的,說明 成功的

 

 

13. 創建 NewsApplication客戶端,我們使用Winform

窗體,我改成這樣子了,上面的藍色文字用於說明

image

 

最重要的一步,添加服務

先不用VS運行宿主

我們手動打開Debug文件夾下的 NewsHosts.exe

image

 

接下來看我演示一下

我們最后注釋掉 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的配置

image

我們配置一下終結點(Endpoint)的綁定配置,名稱就是 上面的<binding name=”這里的名字”>

 

我們還需要修改客戶端的配置,使它可以接受超大的消息

打開NewsApplication的app.config文件

image

 

 

15.設置兩個啟動項目,運行查看效果

先生成解決方案,然后我們設置一下

111

效果圖:

效果圖

 

 

關於 獲得列表,還有點問題

下次調,我再解決一下

 

 

關於NewsDto中我最后不是添加了一個NewsID嗎,我沒有添加DataMember屬性,但是添加上去,似乎還是沒有用,有人知道怎么解決嗎

我把代碼上傳一下了,希望有人能棒棒我,感謝萬分。        代碼下載

 

這個是錯誤信息

接收對 http://localhost:1234/NewsMgr 的 HTTP 響應時發生錯誤。這可能是由於服務終結點綁定未使用 HTTP 協議造成的。這還可能是由於服務器中止了 HTTP 請求上下文(可能由於服務關閉)所致。有關詳細信息,請參見服務器日志。

 

時間不早了,我先睡覺了,大家晚安


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM