Linux上访问SQL Server数据库
.NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
今天微软正式发布了ASP.NET 5 RC1(详见Announcing ASP.NET 5 Release Candidate 1),.NET跨平台迈出了关键一步。
紧跟这次RC1的发布,我们成功地将运行在Linux上的示例站点(http://about.cnblogs.com)升级到了ASP.NET 5 RC1,并且增加了数据库访问功能——基于Entity Framework 7 RC1访问SQL Server数据库。
示例站点页面左侧的导航是从数据库读取数据动态加载的,数据库服务器用的是阿里云RDS(注:创建数据库时需要将支持的字符集设置为SQL_Latin1_General_CP1_CS_AS,这是针对SqlClient中一个bug的临时解决方法)。数据库表是通过EF迁移功能生成的,所用命令如下:
dnx ef migrations add FirstMigration
dnx ef database update
数据库连接字符串是从config.json中读取的。
后端Web服务器用的是kestrel,前端Web服务器用的是阿里云负载均衡,使用中发现一个很奇怪的问题:浏览器直接访问kestrel,速度飞快;而访问阿里云负载均衡,页面虽然显示出来,但页面一直牌加载状态,长达1分钟。
怀疑是阿里云负载均衡与kestrel在TCP通信上存在某些问题,这个问题暂时没有找到解决方法(更新:这是kestrel的一个bug,详见 Don't wait to consume the entire request body for Connection: close requests )。
SQL Server数据库终于能跨平台访问了,接下来就看kestrel的稳定性了。如果kestrel稳定,我们就开始将一些实际使用的小站点迁移至ASP.NET 5,并部署在Linux服务器上。
下面分享一下这个示例ASP.NET 5站点的主要代码。
文件结构:
.
├── config.json
├── Controllers
│ ├── AboutController.cs
│ └── HomeController.cs
├── Data
│ ├── EfDbContext.cs
│ ├── ITabNavRepository.cs
│ └── TabNavRepository.cs
├── Extensions
│ └── HtmlHelperExtensions.cs
├── Models
│ └── TabNav.cs
├── project.json
├── project.lock.json
├── Startup.cs
├── Views
│ ├── About
│ │ ├── Ad.cshtml
│ │ ├── Contact.cshtml
│ │ ├── Intro.cshtml
│ │ └── Job.cshtml
│ ├── Shared
│ │ └── _Layout.cshtml
│ └── _ViewStart.cshtml
└── wwwroot
project.json文件的内容:
{ "webroot": "wwwroot", "exclude": ["wwwroot"], "commands":{ "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://*:8001", "ef": "EntityFramework.Commands"
}, "dependencies":{ "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final", "Microsoft.AspNet.Mvc": "6.0.0-*", "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final", "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "EntityFramework.Commands": "7.0.0-rc1-final", "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final", "System.Runtime.Serialization.Primitives": "4.0.10-*", "System.Net.Security":"4.0.0-*"
}, "frameworks":{ "dnxcore50": {},
}
}
Startup.cs中的代码:
using System;using System.Linq;using Microsoft.AspNet.Builder;using Microsoft.Extensions.DependencyInjection;using Microsoft.Data.Entity;using CNBlogs.AboutUs.Data;using Microsoft.Dnx.Runtime;using Microsoft.Extensions.PlatformAbstractions;using Microsoft.Extensions.Configuration;using System.Data.SqlClient;using Microsoft.Extensions.Logging;namespace CNBlogs.AboutUs.Web
{ public class Startup
{ public Startup(IApplicationEnvironment appEnv)
{
IConfigurationBuilder builder = new ConfigurationBuilder()
.SetBasePath(appEnv.ApplicationBasePath)
.AddJsonFile("config.json", false);
Configuration = builder.Build();
} public IConfiguration Configuration { get; set; } public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
app.UseDeveloperExceptionPage();
app.UseMvcWithDefaultRoute();
app.UseStaticFiles();
app.UseRuntimeInfoPage();
} public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<EfDbContext>(options =>
{
options.UseSqlServer(Configuration["data:ConnectionString"]);
});
services.AddTransient<ITabNavRepository, TabNavRepository>();
}
}
}
- mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
- 安装 IronPython
- Python 项目实践三(Web应用程序)第一篇
- Centos 7.0 安装Mono 3.4 和 Jexus 5.6
- 第一个IronPython程序(之二)
- Python 项目实践二(下载数据)第四篇
- Python 项目实践二(下载数据)第三篇
- 体验扁平化的WordPress 后台管理界面
- Python 项目实践二(生成数据)第二篇
- 重新审视SqlDataReader的使用
- Python 项目实践二(生成数据)第一篇
- 删除 WordPress 导航菜单的多余 CSS 选择器
- 删除 WordPress 导航菜单的多余 CSS 选择器
- 使用asp.net 2.0的CreateUserwizard控件如何向自己的数据表中添加数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法