1. 如何在Windows Server2008R2中部署WebAPI
一、安装说明:
1、安装基本信息
电脑软件
在WindowsServer2008(或WindowsServer2008R2)中,单击“开始”-“程序”-“管理工具”-“服务器管理”,或在“运行”中输入命令:servermanager.msc命令打“服务器管理”程序。
在“角色”选项中,单击“添加角色”:
选择服务器角色:Web服务器(IIS)
单击选中“web服务器(IIS))前面的单选框。
在弹出的对话框中,单击“添加必需的功能”:
“添加角色向导”对web服务器进行简单介绍,之后单击“下一步”:
选择角色需要的相关服务之后单击“下一步”:
确认安装选择,之后单击“下一步”:
系统开始安装所选的角色服务,可能需要几十秒可几钟时间:
安装完成,点击关闭即可:
名称:IIS7.0安装
大小:10MB|版本:7.0|类别:系统工具|语言:中文
应用平台:windows server 2008
2、安装介绍
windows server 2008系统中的iis安装,与windows server 2003中的安装明显不再相同了,windows server 2008安装iis,不再需要其他相关组件,不像windows server 2003需要有i386文件,下面来详细介绍一下,windows server 2008安装iis的步骤:
二、安装步骤:
开始--服务器管理--角色--添加角色
点击添加必需的功能
勾选在“Web服务器(IIS)”
点击下一步
下面是选择“角色服务”的,针对你需要的进行相应的选择
然后点击“下一步”开始确认安装
然后等待安装成功
2. 一文回顾.NET Core 基础设施演进之路
作者丨Matt Mitchell
译者丨平川
随着.NET Core 3.0 预览版 6 的推出,我们认为有必要简要回顾一下基础设施系统的 历史 ,以及在过去一年左右时间里所做的重大改进。如果你对构建基础设施感兴趣,或者希望了解如何构建像.NET Core 这样大的产品,那么这篇文章将非常有趣。
从 3 年前开始,.NET Core 项目就与传统的微软项目有很大的不同。
我们早期的基础设施决策是围绕必要性和便利性做出的。我们使用 Jenkins 进行 GitHub PR 和 CI 验证,因为它支持跨平台的 OSS 开发。我们的官方构建版本位于 Azure DevOps(当时称为 VSTS)和 TeamCity(由 ASP 使用)中,其中有签名和其他关键的交付基础设施。我们搭配使用手动更新包依赖项版本和自动化 GitHub PR 的方法将存储库集成在一起。团队独立地构建了他们需要的工具来进行打包、布局、本地化,以及在大型开发项目中出现的所有其他常见任务。虽然不是很理想,但在某种程度上,这在早期已经运行得足够好了。随着项目从.NET Core 1.0 和 1.1 发展到 2.0 以及更高版本,我们希望投资于进一步整合的技术栈、更快的交付周期和更简单的服务。我们希望每天多次使用最新的运行时来生成一个新的 SDK。我们希望所有这些都不降低独立存储库的开发速度。
.NET Core 面临的许多基础设施方面的挑战都源于存储库结构的隔离和分布式特性。尽管多年来它变化很大,但该产品是由 20 到 30 个独立的 Git 存储库组成(ASP.NET Core 直到最近还比它多得多)。一方面,拥有许多独立的开发竖井会使这些竖井中的开发非常高效;开发人员可以在库中快速迭代,而不用担心栈的其他部分。另一方面,它使得整个项目的创新和集成效率大大降低。下面是一些例子:
在所有这些情况下,都有可能在许多层面上出现失败,从而进一步减缓进程。随着.NET Core 3.0 计划的正式启动,很明显,如果不对基础设施进行重大更改,我们就无法创建所需范围的版本。
为了减轻痛苦,我们三管齐下:
Arcade
在.NET Core 3.0 之前,有 3 到 5 种不同的工具实现分散在不同的存储库中,这和你如何计算有关。
虽然在这个世界上,每个团队都可以定制他们的工具,只构建他们需要的东西,但这确实有一些显着的缺点:
开发人员在存储库之间切换时效率更低
例如:当开发人员从 dotnet/corefx 切换到 dotnet/core-sdk 时,存储库的“语言”是不同的。她输入什么来构建和测试?日志放在哪里?如果她需要在存储库中添加一个新项目,该如何做?
需要的每个特性都要构建 N 次
例如:.NET Core 生成了大量的 NuGet 包。虽然有一些变化(例如,共享运行时包如出自 dotnet/core-setup 的 Microsoft.NETCore.App 就与 Microsoft.AspNet.WebApi.Client 等“普通”包的构建方式不同),但生成它们的步骤非常相似。遗憾的是,由于存储库在布局、项目结构等方面的差异,如何实现这些打包任务方面也产生了差异。存储库如何定义应该生成什么包、这些包中包含什么、它们的元数据等等。如果没有共享工具,团队通常更容易实现另一个打包任务,而不是重用另一个。这当然会导致资源压力。
借助 Arcade,我们努力使所有的存储库采用公共的布局、存储库“语言”和任务集(可能的话)。这并非没有陷阱。任何一种共享工具最终都会解决一些“刚刚好”问题。如果共享工具过于规范,那么在任何规模的项目中进行所需的定制都将变得非常困难,并且更新该工具也将变得非常困难。使用新的更新很容易破坏存储库。构建工具遭受了这种痛苦。使用它的存储库与它紧密耦合,以至于它不仅不能用于其他存储库,而且对构建工具进行任何更改常常会以意想不到的方式伤害用户。如果共享工具不够规范,那么存储库在使用工具时往往会出现差异,并且推出更新通常需要在每个单独的存储库中做大量的工作。那么,为什么要共享工具呢?
实际上,Arcade 尝试同时使用了这两种方法。它将公共存储库“语言”定义为脚本集(请参阅 eng/common)、公共存储库布局和作为 MSBuild SDK 推出的公共构建目标集。选择完全采用 Arcade 的存储库具有可预测的行为,使得更改很容易在存储库之间传播。不希望这样做的存储库可以从提供基本功能(如签名和打包)的各种 MSBuild 任务包中进行选择,这些任务包在所有存储库中看起来都是一样的。当我们对这些任务进行更改时,我们会尽力避免破坏性更改。
让我们来看看 Arcade 提供的主要特性,以及它们如何集成到我们更大的基础设施中。
Azure DevOps
如上所述,较大的团队通过 2.2 版本使用了一个 CI 系统的组合:
许多差异仅仅是出于必要性。Azure DevOps 不支持公共 GitHub PR/CI 验证,所以 ASP.NET Core 转向 AppVeyor 和 Travis 来填补这个空白,而.NET Core 则投资于 Jenkins。经典 Azure DevOps 对构建编排没有太多的支持,所以 ASP.NET Core 团队求助于 TeamCity,而.NET Core 团队则在 Azure DevOps 之上构建了一个名为 PipeBuild 的工具来帮助克服困难。所有这些差异都是非常昂贵的,即使是以一些不明显的方式:
当 Azure DevOps 开始推出基于 YAML 的构建管道和对公共 GitHub 项目的支持时,随着.NET Core 3.0 的启动,我们意识到,我们拥有一个独特的机会。有了这种新的支持,我们可以将现在所有的工作流从单独的系统转移到现代的 Azure DevOps 中,并对我们处理正式 CI 和 PR 工作流的方式进行一些更改。我们的工作大致如下:
到目前为止,所有主要的.NET Core 3.0 存储库都在 Azure DevOps 上进行公共 PR 和正式 CI。一个很好的例子是 dotnet/arcade 本身的正式构建 /PR 管道。
Maestro 和依赖流
.NET Core 3.0 基础架构的最后一块拼图就是我们所说的依赖流。这并不是.NET Core 独有的概念。除非它们是完全自包含的,否则大多数软件项目都包含对其他软件的某种版本化引用。在.NET Core 中,这些包通常表现为 NuGet 包。当我们需要库提供的新特性或修复时,我们通过更新项目中引用的版本号来获取这些新更新。当然,这些包也可能有对其他包的版本化引用,那些其他包可能有更多的引用,等等。这就形成了一张图。当每个存储库拉取其输入依赖项的新版本时,更改将在图中流动。
一个复杂的图
大多数软件项目的主要开发生命周期(开发人员经常从事的工作)通常涉及少量相互关联的存储库。输入依赖关系通常是稳定的,更新很少。当他们确实需要更改的时候,通常是手工操作。开发人员评估输入包的可用版本,选择合适的版本,然后提交更新。但在.NET Core 中并非如此。组件需要独立,以不同的节奏交付,并具有高效的内循环开发体验,这导致了大量具有大量相互依赖关系的存储库。相互依赖关系也形成了一个相当深的图:
Dotnet/core-sdk 存储库作为所有子组件的聚合点。我们提供了一个特定的 dotnet/core-sdk 构建,它描述了所有其他引用的组件。
我们还希望新的输出能够快速通过这个图,以便尽可能多地验证最终产品。例如,我们期望 ASP.NET Core 或.NET Core 运行时的最新片段尽可能多地在 SDK 中表现自己。本质上,这意味着定期快节奏地更新每个存储库中的依赖项。在一个足够大的图中,就像.NET Core 一样,这很快就变成了一个不可能手工完成的任务。这种规模的软件项目可能会通过以下几种方法来解决这个问题:
.NET Core 已经尝试了所有 3 种方法。我们在 1.x 的早期漂移版本。在 2.0 中实现了一定程度的自动化依赖流,并为 2.1 和 2.2 构建了一个复合构建。在 3.0 中,我们决定大量投资于自动化依赖流,放弃其他方法。我们想在一些重要的方面改进我们以前的 2.0 基础设施:
这些概念的设计使得存储库所有者不需要栈或其他团队流程的全局知识就可以参与依赖流。他们只需要知道三件事:
.NET Core 3 开发通道的流图,包括.NET Core 3 Dev 流的其他通道(例如,Arcade 的“.NET Tools Latest”)。
一致和不一致
非一致性会导致哪些问题? 不一致性表示可能的错误状态。举个例子,让我们看看 Microsoft.NETCore.App。这个包表示特定的 API 表面。虽然存储库依赖关系图中可能会引用 Microsoft.NETCore.App 的多个版本,但 SDK 只提供一个。这个运行时必须满足可在该运行时上执行的间接引用组件(例如 WinForms 和 WPF)的所有需求。如果运行时不满足这些需求(例如破坏性 API 变更),可能就会发生故障。在不一致的图中,因为所有存储库都没有使用相同版本的 Microsoft.NETCore.App,有可能错过了一个破坏性的变更。
这是否意味着不一致始终是一种错误状态? 不。例如,我们假设图中 Microsoft.NETCore.App 的不一致只代表一个非破坏性 JIT Bug 修复 coreclr 中的一个变更。从技术上讲,微软没有必要在图中的每一点上获取新的 Microsoft.NETCore.App。只需针对新的运行时交付相同的组件就足够了。
如果不一致只是偶尔的问题,那么我们为什么还要努力才能推出一致的产品呢? 因为很难确定什么时候不一致无关紧要。简单地将一致性作为所需状态进行交付,要比试图理解不一致的组件之间的任何语义差异对最终产品所产生的影响更容易。这是可以做到的,但是从构建频率来说,它是时间密集型的,并且容易出错。强制将一致性作为默认状态更安全。
依赖流的好处
随着存储库图越来越大,所有这些自动化和跟踪都有许多明显的优势。它为我们解决日常生活中的实际问题提供了很多可能性。虽然我们刚刚开始 探索 这个领域,但系统已经可以开始回答一些有趣的问题,并处理以下场景:
随着.NET Core 3.0 逐步结束,我们正在寻找新的领域来改进。虽然计划仍处于(非常)初期的阶段,但我们预计在以下几个关键领域进行投资:
多年来,我们已经对基础设施进行了相当大的改进。从 Jenkins 到 Azure DevOps,从手工依赖流到 Maestro++,从许多工具实现到一个工具实现,我们对.Net Core 3.0 所做的改变是一个巨大的进步。我们已经为开发和交付比以往任何时候都更可靠、更令人兴奋的产品做好了准备。
原文链接:
https://devblogs.microsoft.com/dotnet/the-evolving-infrastructure-of-net-core/
3. rails相较于.net WebAPI有什么优势,有什么劣势
vs中,打开工具=>nuget程序包管理器=>程序包管理器控制台,然后其中一行一行地输入以下的更新指令。Update-PackageMicrosoft.AspNet.WebApi-Version5.2.2汉化包Update-PackageMicrosoft.AspNet.WebApi.Client.zh-Hans-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.Core.zh-Hans-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.WebHost.zh-Hans-Version5.2.2Update-PackageEntityFramework-Version6.0.1Update-PackageEntityFramework.zh-Hans-Version6.0.1Update-PackageMicrosoft.AspNet.Mvc-Version5.2.2Update-PackageMicrosoft.AspNet.Mvc.zh-Hans-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.HelpPage-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.OData-Version5.2.2Update-PackageMicrosoft.AspNet.WebApi.Tracing-Version5.2.2上面package的版本号参考了vs2013中的webapi项目模板中的版本号。引入这些包的过程中,vs有可能提示要重启vs,请重启vs。错误:“未能找到元数据文件”更新完package之后,重新编译,有可能出现“未能找到元数据文件”。解决的方法是找到出错的项目,然后去掉报错的引用项,然后再重新引用。错误:预定义的类型"Microsoft.CSharp.RuntimeBinder.Binder"未定义或未导入错误再次编译,有可能出现错误提示“预定义的类型"Microsoft.CSharp.RuntimeBinder.Binder"未定义或未导入”,解决的方法是:(1)用记事本打开项目文件(后缀名为.csproj),找到项,可能会找到多个,选择其中一个,在里面加入(2)保存项目文件,然后重新加载项目项目文件。
4. aspnet怎么实现前后端分离
1、前后端分离,那后端就不应该修改前端项目文件,并且前后端交互都应通过ajax执行。所以,后端只需要提供api,前端在html调用api即可。
2、要提供api的话,aspx也可以做,但因为page的中间件会造成性能的浪费,可以用ashx去做。当然最推荐的还是使用webapi。
更多关于aspnet怎么实现前后端分离,进入:https://m.abcgonglue.com/ask/5114751615595700.html?zd查看更多内容
5. 谁能帮我看看这个aspnet的web开发应用怎么做啊小妹我实在不行了...
这个工作量相当大的,你跑任务网发任务吧:
http://www.taskcn.com/
6. 使用aspnet.identity 身份验证的框架中,怎么对现有用户进行删除
首先让我先更新 API 项目
我先 API 项目进行必要修改修改完再切换 Web 项目客户端进行更新
第1步:我需要数据库
能做任何操作前我需要先创建数据库本例使用 SQL Server Express没安装载 SQL Server Express安装完创建名 CallingWebApiFromMvc 数据库第步要做
Api 项目需要数据库连接字符串否则我寸步难行面段代码插入 Api 项目Web.config 文件:
认证(Identity)框架自创建我管理用户所需要员关系表现需要担提前创建
第2步:添加相关Nuget包
接我添加用于OWINWindows认证Nuget包打包管理控制台切换Api项目缺省项目输入命令:
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.Owin
使用些包我应用启OWIN服务器通EntityFramework我用户保存SQL Server
第3步:添加管理用户Identity类
我使用基于Windows认证机制Entity框架管理数据库相关业务首先我需要添加些用于处理类Api项目添加Identity目录作我要添加类命名空间添加类:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext
{ public ApplicationDbContext() : base("ApiFromMvcConnection") {}
public static ApplicationDbContext Create()
{ return new ApplicationDbContext();
}
}
注意我传给基类构造函数参数ApiFromMvcConnection要Web.config连接字符串name相匹配
public class ApplicationUserManager : UserManager
{ public ApplicationUserManager(IUserStore store) : base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context)
{ var manager = new ApplicationUserManager(new UserStore (context.Get ()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator (manager)
{
= false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
}; var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider (dataProtectionProvider.Create("ASP.NET Identity"));
} return manager;
}
}
第4步:添加OWIN启类
让我应用程序作OWIN服务器运行我需要应用程序启初始化我通启类做点我装点类
OwinStartup属性应用程序启触发意味着我摆脱Global.asax移
Application_Start代码转换我新启类
using Microsoft.Owin;
[assembly: OwinStartup(typeof(Levelnis.Learning.CallingWebApiFromMvc.Api.Startup))]
namespace Levelnis.Learning.CallingWebApiFromMvc.Api
{
using System;
using System.Web.Http;
using Identity;
using Microsoft.Owin.Security.OAuth;
using Owin;
using Providers;
public class Startup
{ public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext (ApplicationUserManager.Create); var oAuthOptions = new
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(oAuthOptions);
}
}
}
应用程序启我建立自服务器我配置令牌端点并设置自自定义提供商我用我用户进行身份验证我例我使用ApplicationOAuthProvider类让我看看现:
第5步:添加OAuth提供商
public class ApplicationOAuthProvider :
{ public override Task ValidateClientAuthentication( context)
{
context.Validated();
return Task.FromResult (null);
}
public override async Task GrantResourceOwnerCredentials( context)
{
var userManager = context.OwinContext.GetUserManager ();
var user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect."); return;
}
var oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.UserName); var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
private static AuthenticationProperties CreateProperties(string userName)
{
var data = new Dictionary
{
{
"userName", userName
}
};
return new AuthenticationProperties(data);
}
}
我兴趣2种第ValidateClientAuthentication验证客户端我客户端所返
功异步签名没异步调用发我离异步修改我必须返任务自我增加名
看起像:
public class ApplicationUser : IdentityUser
{ public async Task GenerateUserIdentityAsync(UserManager manager, string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
}
第6步:注册新用户 - API端
所我位所Identity类管理用户让我看看RegisterController新用户保存我数据库接受RegisterApi模式简单:
public class RegisterApiModel
{
[Required]
[EmailAddress] public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
public string Password {
get; set;
}
[Required]
[Display(Name = "Confirm Password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
控制器本身注册功返200 OK响应验证失败则返401错误请求响应
public class RegisterController : ApiController
{ private ApplicationUserManager UserManager
{ get
{ return Request.GetOwinContext().GetUserManager ();
}
} public IHttpActionResult Post(RegisterApiModel model)
{ if (!ModelState.IsValid)
{ return BadRequest(ModelState);
} var user = new ApplicationUser
{
Email = model.Email,
UserName = model.Email,
EmailConfirmed = true
};
var result = UserManager.Create(user, model.Password);
return result.Succeeded ? Ok() : GetErrorResult(result);
}
private IHttpActionResult GetErrorResult(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (result.Errors != null)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
if (ModelState.IsValid)
{
// No ModelState errors are available to send, so just return an empty BadRequest.
return BadRequest();
}
return BadRequest(ModelState);
}
}
7. 用MVC WebApi写接口,网闸上了之后,方法访问不到,端口已经全部开放
VisualStudio为我们提供了专门用于创建ASP.NETWebAPI应用的项目模板,借助于此项目模板提供的向导,我们可以“一键式”创建一个完整的ASP.NETWebAPI项目。在项目创建过程中,VisualStudio会自动为我们添加必要的程序集引用和配置,甚至会为我们自动生成相关的代码,总之一句话:这种通过向导生成的项目在被创建之后其本身就是一个可执行的应用。对于IDE提供的这种旨在提高生产效率的自动化机制,我个人自然是推崇的,但是我更推荐读者朋友们去了解一下这些自动化机制具体为我们做了什么?做这些的目的何在?哪些是必需的,哪些又是不必要的?正是基于这样的目的,在接下来演示的实例中,我们将摒弃VisualStudio为我们提供的向导,完全在创建的空项目中编写我们的程序。这些空项目体现在如右图所示的解决方案结构中。如右图所示,整个解决方案一共包含6个项目,上面介绍的作为“联系人管理器”的单页Web应用对应着项目WebApp,下面的列表给出了包括它在内的所有项目的类型和扮演的角色。·Common:这是一个空的类库项目,仅仅定义了表示联系人的数据类型而已。之所以将数据类型定义在独立的项目中,只要是考虑到它会被多个项目(WebApi和ConsoleApp)所使用。WebApi:这是一个空的类库项目,表现为HttpController类型的WebAPI就定义在此项目中,它具有对Common的项目引用。WebHost:这是一个空的ASP.NETWeb应用,它实现了针对ASP.NETWebAPI的WebHost寄宿,该项目具有针对WebApi的项目引用。SelfHost:这是一个空的控制台应用,旨在模拟ASP.NETWebAPI的SelfHost寄宿模式,它同样具有针对WebApi的项目引用。WebApp:这是一个空的ASP.NETWeb应用,代表“联系人管理器”的网页就存在于该项目之中,至于具体的联系人管理功能,自然通过以Ajax的形式调用WebAPI来完成。ConsoleApp:这是一个空的控制台应用,我们用它来模拟如何利用客户端代理来实现对WebAPI的远程调用,它具有针对Common的项目引用。二、定义WebAPI在正式定义WebAPI之前,我们需要在项目Common中定义代表联系人的数据类型Contact。简单起见,我们仅仅为Contact定义了如下几个简单的属性,它们分别代表联系人的ID、姓名、联系电话、电子邮箱和联系地址。1:publicclassContact2:{3:publicstringId{get;set;}4:publicstringName{get;set;}5:publicstringPhoneNo{get;set;}6:publicstringEmailAddress{get;set;}7:publicstringAddress{get;set;}8:}表现为HttpController的WebAPI定义在WebApi项目之中,我们一般将ApiController作为继承的基类。ApiController定义在“System.Web.Http.dll”程序集中,我们可以在目录“%ProgramFiles%\MicrosoftASP.NET\ASP.NETWebStack5\Packages\”中找到这个程序集。具体来说,该程序集存在于子目录“Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”中。WebAPI体现在如下所示的ContactsController类型中。在该类型中,我们定义了Get、Post、Put和Delete这4个Action方法,它们分别实现了针对联系人的查询、添加、修改和删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NETWebAPI默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自所能处理请求必须采用的HTTP方法。1:publicclassContactsController:ApiController2:{3:staticListcontacts;4:staticintcounter=2;5:6:staticContactsController()7:{8:contacts=newList();9:contacts.Add(newContact{Id="001",Name="张三",10:PhoneNo="0512-12345678",EmailAddress="[email protected]",11:Address="江苏省苏州市星湖街328号"});12:contacts.Add(newContact{Id="002",Name="李四",13:PhoneNo="0512-23456789",EmailAddress="[email protected]",14:Address="江苏省苏州市金鸡湖大道328号"});15:}16:17:publicIEnumerableGet(stringid=null)18:{19:returnfromcontactincontacts20:wherecontact.Id==id||string.IsNullOrEmpty(id)21:selectcontact;22:}23:24:publicvoidPost(Contactcontact)25:{26:Interlocked.Increment(refcounter);27:contact.Id=counter.ToString("D3");28:contacts.Add(contact);29:}30:31:publicvoidPut(Contactcontact)32:{33:contacts.Remove(contacts.First(c=>c.Id==contact.Id));34:contacts.Add(contact);35:}36:37:publicvoidDelete(stringid)38:{39:contacts.Remove(contacts.First(c=>c.Id==id));40:}41:}简单起见,我们利用一个静态字段(contacts)表示存储的联系人列表。当ContactsController类型被加载的时候,我们添加了两个ID分别为“001”和“002”的联系人记录。至于实现联系人CRUD操作的Action方法,我们也省略了必要的验证,对于本书后续的演示的实例,我们基本上也会采用这种“简写”的风格。
8. 人民邮电出版社出的那本ASP.NET从入门到精通光盘内容在那里下载
可以到IT学习联盟下载。但是这套教程只是基础。要学会真正到aspnet就要一套完整的aspnet视频教程。完整的aspnet教程可以看看IT学习联盟网站的<<零基础aspnet就业班>>。零基础aspnet就业班包括aspnet基础 进阶 高级 项目。是一套完整的aspnet视频教程。
………………………………………………
如果对aspnet感兴趣,看看一个大专生怎么自学aspnet到找到工作。
先做个自我介绍,我07年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说 出来献丑了。09年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不 到希望,我就退学了。
退学后我也迷茫,大专都没有毕业,我真的不知道我能干什么,我在纠结着我能做什么。所以辍学后 我一段时间,我想去找工作,因为我比较沉默寡言,不是很会说话,我不适合去应聘做业务。我想应聘 做技术的,可是处处碰壁。
一次偶然的机会,我才听到aspnet这个行业。那天我去新华书店,在计算机分类那边想找本书学习 。后来有个女孩子走过来,问我是不是读计算机的,有没有兴趣学习aspnet,然后给我介绍了一下 aspnet现在的火热情况,告诉我学aspnet多么的有前景,给我了一份传单,aspnet培训的广告。听了 她的介绍,我心里痒痒的,确实我很想去学会一门自己的技术,靠自己的双手吃饭。
回家后,我就上网查了下aspnet,确实是当今比较热门的行业,也是比较好找工作的,工资也是相 对比较高。我就下决心想学aspnet了。于是我去找aspnet培训的相关信息,说真的,我也很迷茫,我 不知道培训是否真的能像他们宣传的那样好,所以我就想了解一段时间再做打算。
后来,我在网络知道看到一篇让我很鼓舞的文章是一个aspnet高手介绍没有基础的朋友怎么自学入 门学aspnet,文章写的很好,包含了如何学习,该怎么学习。他提到一个方法就是看视频,因为看书实 在太枯燥和费解的,很多我们也看不懂。这点我真的很认同,我自己看书往往看不了几页。
我在想,为什么别人都能自学成才,我也可以的!我要相信自己,所以我就想自学,如果实在学不会 我再去培训。
主意一定,我就去搜索aspnet的视频,虽然零星找到一些aspnet的视频,但是都不系统,我是想找 一个能够告诉我该怎么学的视频,一套从入门到精通的视频,一个比较完整的资料,最好能有老师教, 不懂可以请教的。
后来我又找到一份很好的视频,是在IT学习联盟推出的一份视频《零基础aspnet就业班》(喜欢《 零基础aspnet就业班》的可以复制 sina.lt/bsjr 粘贴浏览器地址栏按回车键即打开)
下面介绍下我的学习流程,希望对和我一样完全没有基础的朋友有所帮助。
收到他们寄过来的光盘后,我就开始学习了,由于我没有什么基础,我就从最简单的C#语言视频教程 学起,话说简单,其实我还是很多不懂的,只要重复多看几遍,就能看懂。C#语言我差不多学了一个礼 拜,接下来我就学了winform,SQL Server,html/css/javaScript,差不多也就三个礼拜。我每天都在不 停的写一些简单的代码,这样一月后我基本掌握了aspnet的全部基础。
接下来开始学习aspnet高级课程,老师幽默风趣而又轻松的课堂教课,使我发现原来学习aspnet并 不是一件很难的事情。之前我把aspnet基础学得还不错,到了到了aspnet高级部分,我觉不又不是很 难,可能老师太牛了,他能把复杂的问题讲的比较通俗易懂,有些难点的地方我还是连续看了五六次, 把他弄懂。每天下午6点下班后,吃了饭,马上跑回家。看视频,买了几本笔记本。当时,为了编程还花几百元了台二手的台式电脑,配置一般,但编程是足够的。一边看视频,一边记笔记,把重点都记下来,还一边跟着老师敲代码,为了能尽早学会aspnet。每天都坚持学5-6个小时。经常学到晚上一点多才睡觉。星期六,日不用上班,每天7点多起床,学到晚上11,12点。那段时间特别辛苦,特别累。在学习aspnet的三个多月里,除了吃饭睡觉工作,剩余的时间都在学习,因为我知道自己的计算机基础不是很好,也没有学过什么计算机,相对于那些科班的人来说我要比他们付出更多的努力。我只能咬紧牙关,坚持下去,我不能放弃,我要完成我的梦想,我要让我的家人过上好日子。终于三个多月后我把aspnet教程里的内容和项目都学完了,在学项目的过程中我发现项目特别重要,他能把你学过的知识全部联系起来,能更好的理解你所学的知识。还有学习过程中,动手很重要,要经常跟着老师动手敲,动手吧,跟着做,一行一行的跟着敲,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。 如果遇到暂时对于一些思路不能理解的,动手写,先写代码,慢慢你就会懂了。
于是我就到51job疯狂的投简历,因为我学历的问题,专科没有毕业,说真的,大公司没有人会要我,所以我投的都是民营的小公司,我希望自己的努力有所回报。没有想过几天过后,就有面试了,但是第一次面试我失败了,虽然我自认为笔试很好,因为我之前做了准备,但是他们的要求比较严格,需要有一年的项目经验,所以我没有被选中。
后来陆续面试了几家公司,终于功夫不负有心人。我终于面试上的,是在闵行的一家民营的企业,公司规模比较小,我的职务是aspnet开发程序员,但我也比较满足,开的工资是3500一个月,虽然我知道在上海3500只能过温饱的生活,但是我想我足够了。我至少不用每天都要靠父母养,我自己也能养活自己的。我想只要我继续努力,我工资一定会翻倍的。
把本文写出来,希望能让和我一样的没有基础的朋友有信心,其实我们没有必要自卑,我们不比别人笨,只要我们肯努力,我们一样会成功。
…………………………………………