《ASP.NET MVC 企业级实战》阅读笔记

小应用概述:获取天气预报(9.2)

第一章 MVC开发前奏

1.1 开发环境搭建

1.1.1 操作系统和开发工具

1.操作系统;2.VS;3.SQL SERVER;4.MySQL;5.Git(TortoiseGit/SourceTree);6.Reflector

1.1.2 VS基本配置
  • 1.显示行号
    “工具---->选项---->文本编辑器---->所有语言”下的“行号”
显示行号
  • 2.设置屏幕保护色
    “工具>>>选项>>>环境>>>字体和颜色>>>项背景>>>自定义”设置“R:204,G:232,B:204”

1.2 常用辅助开发工具介绍

Firebug,HttpRequester/Poster。

1.3 知识储备

C#,ADO.Net,SQL,HTML,CSS,JS,JQ,ASP.NET WebForm

第二章 Entity Framework

使用EF的目的就是为了高效地开发,如果项目中对性能要求非常高,业务又十分复杂的话,就不建议使用EF,可以考虑使用一些轻量级ORM框架或者直接使用原生SQL或存储过程。

2.1 Entity Framework简介

Entity Framework 的全称为ADO.NET Entity Framework,简称为EF。
  EF(实体框架)是微软以ADO.NET为基础所发展出来的对象关系对应(O/R Mapping)解决方案。
Entity Frmework 的特点:

  • 支持多种数据库(MSSQL,Oracle,Mysql和DB2)
  • 强劲的映射引擎,能很好地支持储存过程。
  • 提供VS集成工具,进行可视化操作
  • 能够与ASP.NET、WPF、WCF、WCF Data Services进行很好的集成。
    什么是O/R Mapping?
      广义上,ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的互相转换。
      狭义上,ORM可以被认为是基于关系型数据库的数据存储,实现一个虚拟的面向对象的户数据访问接口。

2.2 Database First 开发方式

DBFirst又叫数据库优先开发方式,是一种比较旧的开发方式,现在越来越多的企业已经不再使用。

2.2.1 创建Database First Demo

第一步:首先准备一张表:

新建数据表

第二步:新建---项目----Windows---控制台程序

新建项目

第三步:添加“数据实体模型”



这一步,需要自己下载一些插件,让mysql和vs联系起来,例如EF框架,mysql for vs2013/odbc等。


新建连接

之前的那张表无意删了,又建了张新表:
 static void Main(string[] args)
        {
            studentEntities entity = new studentEntities();
            grade g_grade = new grade() { id = 2,Sid = 1,grade1 = 11 };
            entity.grades.Add(g_grade);
            entity.SaveChanges();
        }
执行结果
2.2.2 新增
 static int Add()
        {
            using (NorthwindEntities db = new NorthwindEntities())
            {
                Customer customer = new Customer 
                {
                    CustomerID = "zzh",
                    Address = "安徽蚌埠",
                    City = "安徽",
                    Phone = "123321123",
                    CompanyName = "网新",
                    ContactName = "中华"

                };
                //方法一
                db.Customers.Add(customer);
                //方法二(此部分报错)
                //DbEntityEntry<Customer> entry = db.Entry<Customer>(customer);
                //entry.State = System.Data.EntityState.Added;
               return db.SaveChanges();

            }
        }

突然还是想把刚刚没实现的方法试一下,然后,添加了一个应用,system.data.service.client,然后引入using System.Data.Entity.Infrastructure;起初还是报错,然后调来调去也没调好,然后试了下第一种方法,然后再切换到第二种方法时,就可以插入数据了,问题也没找出来。
贴一下执行的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity.Infrastructure;


namespace TestOne
{
    class Program
    {
        #region add
        static int Add()
        {
            try
            {
                using (NorthwindEntities db = new NorthwindEntities())
                {
                    Customer customer = new Customer
                    {
                        CustomerID = "an",
                        Address = "安",
                        City = "安ss",
                        Phone = "3321123",
                        CompanyName = "dd网",
                        ContactName = "中dd"

                    };
                    //方法一
                    //db.Customers.Add(customer);
                    //方法二
                    DbEntityEntry<Customer> entry = db.Entry<Customer>(customer);
                    entry.State = System.Data.Entity.EntityState.Added;
                    return db.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
                throw;
            }
        }
        #endregion
        #region 查询一
        static void QueryDelay()
        {
            using (NorthwindEntities db = new NorthwindEntities())
            { 
                //DbQuery<>
            }
        }
        #endregion
        static void Main(string[] args)
        {
            Add();
        }
    }
}

执行结果:


2.2.3 简单查询和延时加载

为了查看延时加载,要使用SqlProfiler跟踪SQL语句,加断点、加SqlProfiler跟踪事件。


static void QueryDelay()
        {
            using (NorthwindEntities db = new NorthwindEntities())
            {
                DbQuery<Customer> dbQuery = db.Customers.Where(p => p.ContactName == "中华").OrderBy(p => p.ContactName).Take(1) as DbQuery<Customer>;
                //获得延迟查询对象后,叼哦那个对象的获取方法,此时,就会根据之前的条件生成SQL语句
                //查询数据库
                Customer customer = dbQuery.FirstOrDefault();
                //或者SingleOrDefault()
                Console.WriteLine(customer.ContactName + customer.Address + customer.CustomerID);

            }

使用SqlProfiler追踪Sql语句:


第九章 分布式技术

9.1 WebService

第一步: 创建一个空项目,WebAppService,.net framework 4.5
第二步:右击项目,添加新项,web服务,命名为“MyWebService.asmx”
第三步:在MyWebService类中默认会添加一个HelloWorld方法,继续添加如下方法:

[WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
        /// <summary>
        /// 乘法运算
        /// </summary>
        /// <param name="a">参数a</param>
        /// <param name="b">参数b</param>
        /// <returns>a * b</returns>
        [WebMethod]
        [WebMethod(Description = "乘法运算(计算两个数相乘的结果)")]
        public int Multiplier(int a, int b)
        {
            return a * b;
        }

第四步:直接在浏览器中浏览MyWebService.asmx。





第五步:创建web窗体

form id="form1" runat="server">
    <div>
        <asp:textbox ID ="txtA" runat="server"></asp:textbox>
        *
        <asp:textbox ID ="txtB" runat="server"></asp:textbox>
        <asp:Button ID ="btnGetResult" runat="server" Text ="=" OnClick ="btnGetResult_Click"/>
        <asp:TextBox ID="txtResult" runat="server"></asp:TextBox>
    </div>
    </form>

第六步:添加服务引用



第七步:点击按钮事件代码:

protected void btnGetResult_Click(object sender, EventArgs e)
        {
            ServiceRef.MyWebServiceSoapClient _client = new ServiceRef.MyWebServiceSoapClient();
            txtResult.Text = _client.Multiplier(int.Parse(txtA.Text.Trim()), int.Parse(txtB.Text.Trim())).ToString();
        }

第八步:运行页面

9.2 调用天气预报服务

第一步:百度搜索“天气预报服务”,这里以http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName这个天气预报为例。
第二步:引入web服务:添加服务引用---》高级--->添加web引用


第三步:从http://www.webxml.com.cn/images/weather.zip中下载天气预报图标,然后解压,将文件加weather复制到根目录文件夹Content下。
第四步:添加Home控制 器和两个GetWeather方法,实现代码。
HomeControler.cs:

  public ActionResult GetWeather()
        {
            return View();
        }
        
        [HttpPost]
        public ActionResult GetWeather(String city)
        { 
            //把webservice当作一个类操作
            Weather.WeatherWebService client = new Weather.WeatherWebService();
            var s = client.getWeatherbyCityName(city);
            if (s[8] == "")
            {
                ViewBag.Msg = "暂时不支持您查询的城市";
            }
            else 
            {
                ViewBag.ImgUrl = @"/Content/weather/" + s[8];
                ViewBag.General = s[1] + " " + s[6];
                ViewBag.Actually = s[10];
            }
            return View();
        }

GetWeather.cshtml

@{
    ViewBag.Title = "GetWeather";
}

@using (Html.BeginForm("GetWeather", "Home", FormMethod.Post))
{ 
    <div>
        请输入查询的城市:@Html.TextBox("city")<input type="submit" value="查询">
    </div>
    <div>天气概况: @ViewBag.General  @{
        if(!string.IsNullOrEmpty(ViewBag.ImgUrl as string))
        {![](@ViewBag.ImgUrl)}
        }
    </div>
    <div>天气实况:@ViewBag.Actually</div>
    <div>@ViewBag.Msg</div>
}

9.3 WCF

WCF(Windows Communication Foundation)是.NET Framework的扩展,它 提供了创建安全的、可靠的、事务服务的统一框架,WCF 整合和扩展了现有分布式系统的开发技术,如Microsoft .NET Remoting、Web Services、Web Services Enhancements (WSE)等等,来开发统一的可靠系统。
  SOA:面向服务的架构(SOA[Service-Oriented Architecture])是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

9.3.1 WCF体系架构简介
  • 契约[协定]
  • 服务运行
  • 消息传递
  • 宿主和激活
9.3.2 WCF的基础概念
  • 地址
  • 绑定
  • 契约
  • 终结点
  • 元数据
  • 宿主



9.4 创建第一个WCF程序

第一步:新建项目----->类库



第二步:添加System.ServiceModel程序集引用



第三步:新建一个接口IHelloService.cs,引入命名空间using System.ServiceModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;

namespace HelloService
{
    [ServiceContract]
    public interface IHelloService
    {
        [OperationContract]
        string SayHello(string name);
    }
}

第四步:添加HelloService类实现IHelloService接口

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

namespace HelloService
{
   public class HelloService : IHelloService
    {
       public string SayHello(string name)
       {
           return "你好,我是" + name;
       }
    }
}

第五步:新建宿主,选择“新建项目---->控制台应用程序”,并命名为HelloSErviceHost
第六步:添加System.ServiceModel引用和项目引用HelloService,应用之前的类库项目。
第七步:在HelloServiceHost项目中,修改Program.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//添加引用
using System.ServiceModel;
using System.ServiceModel.Channels;
namespace HelloServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            //using(MyHelloHost host = )
        }


        
    }
    public class MyHelloHost : IDisposable
    {
        /// <summary>
        /// 定义一个服务对象
        /// </summary>
        private ServiceHost _myHelloHost;
        public const string BaseAddress = "net.pipe:localhost";//基地址
        public const string HelloServiceAddress = "Hello";//可选地址
        public static readonly Type ServiceType = typeof(HelloService.HelloService);//服务契约实现类型
        public static readonly Type ContractType = typeof(HelloService.HelloService);//服务契约接口
        public static readonly Binding HelloBinding = new NetNamedPipeBinding();//服务定义一个绑定
        /// <summary>
        /// 构造方法
        /// </summary>
        public MyHelloHost()
        {
            CreateHelloServiceHost();
        }
        protected void CreateHelloServiceHost()
        {
            _myHelloHost = new ServiceHost(ServiceType, new Uri[] { new Uri(BaseAddress) });//创建服务对象
            _myHelloHost.AddServiceEndpoint(ContractType,HelloBinding,HelloServiceAddress);//添加终结点
        }
        /// <summary>
        /// 打开服务方法
        /// </summary>
        public void Open()
        {
            Console.WriteLine("开始启动服务...");
            _myHelloHost.Open();
            Console.WriteLine("服务已经启动");
        }

        /// <summary>
        /// 销毁服务宿主对象实例
        /// </summary>
        public void Dispost()
        {
            if (_myHelloHost != null)
            {
                (_myHelloHost as IDisposable).Dispose();
            }
        }
    }
}

第八步:新建客户断调用程序,选择“新建项目--->控制太应用程序”,并命名为HelloClient。
第九步:添加项目引用,HelloService、HelloServiceHost和程序集System.ServiceModel。
第十步:修改HelloClient项目中的Program.cs代码:

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

using System.ServiceModel;
using System.ServiceModel.Channels;
using HelloService;

namespace HelloClient
{
    class Program
    {
        static void Main(string[] args)
        {
            using (HelloProxy proxy = new HelloProxy())
            { 
                //利用代理调用方法
                Console.WriteLine(proxy.Say("张中华"));
                Console.ReadLine();
            }
        }
    }
    [ServiceContract]
    interface IService
    {
        [OperationContract]
        string Say(string name);
    }

    class HelloProxy : ClientBase<IHelloService>, IService
    {
        public static readonly Binding HelloBinding = new NetNamedPipeBinding();
        //硬编码定义绑定
        //硬编码定义地址,注意这里要和之前服务定义的地址保持一致
        public static readonly EndpointAddress HelloAddress = new EndpointAddress(new Uri("net.pipe://localhost/Hello"));
        public HelloProxy() : base(HelloBinding, HelloAddress) { }//构造方法
        public string Say(string name)
        { 
            //使用Channel属性服务进行调用
            return Channel.SayHello(name);
        }
    }
}

第十一步:运行HelloServiceHost


第十二步:运行HelloClient



这个地方采用新实例运行,不然会报错。



当HelloServiceHost没启动时:

当设置启动方案为多启动项时:

9.5 直接创建WCF项目

第一步:新建WCF服务,命名为MyWcfService
第二步:右击Service1.svc,选择“在浏览器中查看”



第三步:新建控制台程序WcfClient,并添加MyWcfService.Service1.svc服务引用



第四步:修改Program类中的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WcfClient
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceRef.Service1Client _client = new ServiceRef.Service1Client();
            Console.WriteLine(_client.GetData(11));
            Console.ReadLine();
        }
    }
}

第五步:运行WcfClient项目


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容