Visual Studio 2015 + C# 快速搭建WebApi连接SqlServer数据库(附完整代码)

发布时间:2026/5/20 3:41:42

Visual Studio 2015 + C# 快速搭建WebApi连接SqlServer数据库(附完整代码) Visual Studio 2015与C# WebApi开发实战从零构建SqlServer数据服务在数字化转型浪潮中API已成为系统间数据交互的核心桥梁。对于.NET开发者而言Visual Studio 2015配合C#语言构建WebApi服务仍是许多传统企业项目的技术选择。本文将带您完整走通开发流程不仅包含基础操作步骤更会深入探讨配置优化、安全实践等进阶内容助您快速搭建可投入生产的数据库服务接口。1. 开发环境准备与项目初始化工欲善其事必先利其器。在开始编码前我们需要确保开发环境配置正确。Visual Studio 2015虽然已不是最新版本但其稳定的性能和完整的.NET框架支持使其在维护老项目时仍具价值。必备组件清单Visual Studio 2015 Community/Professional版本.NET Framework 4.5或更高版本SQL Server 2008 R2及以上版本推荐使用SQL Server Management Studio管理数据库Postman或类似API测试工具安装完成后按以下步骤创建项目启动VS2015选择文件 → 新建 → 项目在模板窗口导航至Visual C# → Web → ASP.NET Web应用程序命名项目如BookApiService指定存储路径在新建项目对话框中选择Web API模板取消添加单元测试选项初学者可暂不关注点击确定完成创建提示项目创建时若遇到NuGet包还原失败可手动执行工具 → NuGet包管理器 → 程序包管理器控制台输入Update-Package -reinstall命令修复依赖。项目结构生成后重点关注以下目录Controllers/API控制器存放位置App_Start/包含路由等配置类Web.config应用程序配置文件2. 构建基础WebApi控制器控制器是WebApi的核心组件负责处理HTTP请求并返回响应。我们将创建一个具备完整CRUD功能的数据接口控制器。2.1 添加API控制器在解决方案资源管理器中右键点击Controllers文件夹选择添加 → 控制器选择Web API 2控制器 - 空命名为BooksController遵循RESTful命名规范生成的基础控制器代码如下using System.Web.Http; namespace BookApiService.Controllers { public class BooksController : ApiController { // GET api/books public IHttpActionResult Get() { return Ok(API is running); } } }2.2 配置路由规则现代WebApi通常采用属性路由Attribute Routing提供更灵活的路由控制。修改WebApiConfig.cs文件启用该特性public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 启用属性路由 config.MapHttpAttributeRoutes(); // 传统路由配置 config.Routes.MapHttpRoute( name: DefaultApi, routeTemplate: api/{controller}/{id}, defaults: new { id RouteParameter.Optional } ); } }然后在控制器中添加路由属性[RoutePrefix(api/books)] public class BooksController : ApiController { [HttpGet] [Route()] // 对应GET api/books public IHttpActionResult GetAllBooks() { // 实现代码... } }3. 集成SqlServer数据库数据库连接是WebApi的核心功能之一正确的配置方式直接影响应用的安全性和性能。3.1 数据库连接配置安全最佳实践是将连接字符串存储在配置文件中而非硬编码。修改Web.config的connectionStrings节点connectionStrings add nameBookDb connectionStringData Source.;Initial CatalogBookDB;Integrated SecurityTrue; providerNameSystem.Data.SqlClient / /connectionStrings注意生产环境应使用SQL账号认证而非Windows集成认证且密码应通过加密配置或使用Azure Key Vault等安全存储方案。3.2 实现数据访问层推荐使用ADO.NET的SqlConnection和SqlCommand进行基础数据操作。以下是完整的数据访问示例using System.Configuration; using System.Data; using System.Data.SqlClient; public class BookRepository { private readonly string _connectionString; public BookRepository() { _connectionString ConfigurationManager .ConnectionStrings[BookDb].ConnectionString; } public DataTable GetAllBooks() { var dataTable new DataTable(); using (var connection new SqlConnection(_connectionString)) using (var command new SqlCommand(SELECT * FROM Books, connection)) { connection.Open(); var reader command.ExecuteReader(); dataTable.Load(reader); } return dataTable; } public int AddBook(string title, string author, decimal price) { const string sql INSERT INTO Books (Title, Author, Price) VALUES (title, author, price); SELECT SCOPE_IDENTITY();; using (var connection new SqlConnection(_connectionString)) using (var command new SqlCommand(sql, connection)) { command.Parameters.AddWithValue(title, title); command.Parameters.AddWithValue(author, author); command.Parameters.AddWithValue(price, price); connection.Open(); return Convert.ToInt32(command.ExecuteScalar()); } } }3.3 控制器集成数据访问将数据访问层注入控制器实现完整的API端点[RoutePrefix(api/books)] public class BooksController : ApiController { private readonly BookRepository _repository new BookRepository(); [HttpGet] [Route()] public IHttpActionResult GetAll() { try { var books _repository.GetAllBooks(); return Ok(books); } catch (Exception ex) { return InternalServerError(ex); } } [HttpPost] [Route()] public IHttpActionResult Create([FromBody]BookModel model) { if (!ModelState.IsValid) return BadRequest(ModelState); var id _repository.AddBook(model.Title, model.Author, model.Price); return Created($api/books/{id}, model); } }4. 进阶配置与优化基础功能实现后我们需要关注性能优化和安全性提升使API达到生产级标准。4.1 连接池配置SqlConnection默认启用连接池但合理配置可进一步提升性能add nameBookDb connectionStringData Source.;Initial CatalogBookDB; Integrated SecurityTrue; Max Pool Size100; Min Pool Size10; Connection Timeout30 providerNameSystem.Data.SqlClient /关键参数说明参数推荐值作用Max Pool Size100-200最大连接数Min Pool Size10-20最小保持连接数Connection Timeout15-30连接超时(秒)4.2 异常处理策略全局异常处理可避免敏感信息泄露public class CustomExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext context) { if (context.Exception is SqlException) { context.Response context.Request .CreateErrorResponse(HttpStatusCode.InternalServerError, 数据库操作异常); } else { context.Response context.Request .CreateErrorResponse(HttpStatusCode.InternalServerError, new HttpError(系统处理请求时发生错误)); } } }在WebApiConfig中注册config.Filters.Add(new CustomExceptionFilterAttribute());4.3 性能监控配置添加性能计数器监控API响应时间public class TimerAttribute : ActionFilterAttribute { private Stopwatch _stopwatch; public override void OnActionExecuting(HttpActionContext actionContext) { _stopwatch Stopwatch.StartNew(); base.OnActionExecuting(actionContext); } public override void OnActionExecuted(HttpActionExecutedContext actionContext) { _stopwatch.Stop(); var responseTime _stopwatch.ElapsedMilliseconds; // 记录到日志系统或Application Insights Debug.WriteLine($API执行时间: {responseTime}ms); base.OnActionExecuted(actionContext); } }5. 测试与调试技巧完善的测试流程是保证API质量的关键环节。5.1 Postman测试用例GET请求测试设置请求方法为GET输入URLhttp://localhost:端口/api/books添加HeaderAccept: application/json发送请求检查返回状态码应为200POST请求测试设置请求方法为POST输入URLhttp://localhost:端口/api/books设置HeaderContent-Type: application/json在Body中输入JSON数据{ title: C#高级编程, author: Christian Nagel, price: 99.9 }5.2 日志记录配置添加NLog等日志组件记录关键操作安装NLog.Config和NLog.WebApi NuGet包配置nlog.configtargets target namefile xsi:typeFile fileName${basedir}/logs/${shortdate}.log layout${longdate}|${level}|${message} / /targets rules logger name* minlevelInfo writeTofile / /rules在控制器中使用日志private static readonly Logger Logger LogManager.GetCurrentClassLogger(); [HttpGet] [Route()] public IHttpActionResult GetAll() { Logger.Info(开始获取所有图书数据); // ... }6. 部署与IIS配置将开发完成的WebApi部署到IIS服务器需要特别注意以下配置6.1 发布包生成右键项目选择发布选择自定义配置文件设置发布方法为文件系统指定目标位置如bin\Release\PublishOutput在设置选项卡中配置配置Release目标框架net45删除现有文件勾选6.2 IIS服务器配置安装IIS的ASP.NET 4.5功能创建新网站指向发布目录配置应用程序池.NET CLR版本v4.0托管管道模式集成设置适当权限通常需要授予IIS_IUSRS读取权限常见问题解决方案HTTP 500.19错误通常因缺少URL重写模块导致安装URL Rewrite Module403禁止访问检查匿名身份验证使用的账户是否有目录读取权限数据库连接失败确保连接字符串中的服务器地址和认证信息正确7. 安全加固措施上线前的安全审查必不可少以下是关键检查项输入验证对所有API参数进行验证public class BookModel { [Required, StringLength(100)] public string Title { get; set; } [Range(0, 1000)] public decimal Price { get; set; } }SQL注入防护始终使用参数化查询// 错误示范 var sql $SELECT * FROM Books WHERE Title {title}; // 正确做法 var sql SELECT * FROM Books WHERE Title title; command.Parameters.AddWithValue(title, title);HTTPS强制启用在Global.asax中添加protected void Application_BeginRequest() { if (!Context.Request.IsSecureConnection) { Response.Redirect(Context.Request.Url.ToString() .Replace(http:, https:)); } }API密钥验证实现自定义授权过滤器public class ApiKeyAuthorizeAttribute : AuthorizeAttribute { protected override bool IsAuthorized(HttpActionContext actionContext) { var apiKey actionContext.Request .Headers.GetValues(X-API-KEY).FirstOrDefault(); return apiKey ConfigurationManager.AppSettings[ValidApiKey]; } }8. 性能优化进阶对于高并发场景还需要考虑以下优化策略异步API实现[HttpGet] [Route(async)] public async TaskIHttpActionResult GetAllAsync() { var books await _repository.GetAllBooksAsync(); return Ok(books); }缓存策略使用System.Runtime.Cachingprivate static readonly ObjectCache Cache MemoryCache.Default; [HttpGet] [Route(cached)] public IHttpActionResult GetCachedData() { const string cacheKey allBooks; var books Cache[cacheKey] as DataTable; if (books null) { books _repository.GetAllBooks(); Cache.Add(cacheKey, books, DateTime.Now.AddMinutes(10)); // 缓存10分钟 } return Ok(books); }响应压缩在WebApiConfig中启用config.MessageHandlers.Add(new CompressionHandler());分页支持避免返回大量数据[HttpGet] [Route(paged)] public IHttpActionResult GetPaged(int page 1, int size 10) { var total _repository.GetBookCount(); var books _repository.GetBooks(page, size); return Ok(new PagedResultBook { Data books, Page page, PageSize size, TotalCount total }); }在实际项目开发中根据具体业务需求可能还需要考虑版本控制、文档生成、限流熔断等更多高级特性。建议使用Swagger等工具生成API文档便于团队协作和前后端对接。

相关新闻