services.AddDbContext<CustomContext>(options =>{ options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));}); |
---|
發佈於 2018-10-11
这一篇,记录关于 .Net 和 .Net Core 的一些零碎的知识点,随时更新。
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="Content-Type" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> </customHeaders> </httpProtocol> </system.webServer> |
---|
public string Options() { return null; // HTTP 200 response with empty body } |
---|
//允许某些源 services.AddCors(options => { options.AddPolicy("AllowCors", policy => { // 多个可以用 `,` 隔开 policy.WithOrigins("http://localhost:3000","http://127.0.0.1") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); |
---|
如果是所有方法都允许跨域,就在 Configure 方法中还需要添加以下代码:
app.UseCors("AllowCors");//必须位于 UserMvc 之前 app.UseMvc(); |
---|
如果是某些方法允许跨域,就在该 Controller 添加如下代码:
using Microsoft.AspNetCore.Cors; [EnableCors("AllowCors")] //可实现指定某个 controller 或者 action 跨域 |
---|
对于 .Net Framework MVC:
对于 .Net Core MVC:
对于 .Net Framework API:
对于 .Net Core API:
在 .Net Core WebAPI 默认是 JSON 输出,而 .Net Framework WebAPI 默认是 XML 输出。如果希望 Framework 以 JSON 格式返回,则需要在 WebApiConfig.cs 的 Register 方法添加如下代码:
config.Formatters.Remove(config.Formatters.XmlFormatter); config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver(); |
---|
虽然 .Net Core WebAPI 默认是 JSON 输出,但是返回的对象是驼峰命名,如果希望与实体属性对应,需要在 ConfigureServices 方法添加如下代码:
services.AddMvc() .AddJsonOptions(options => { if (options.SerializerSettings.ContractResolver is DefaultContractResolver resolver) { resolver.NamingStrategy = null; } }); |
---|
虚拟主机(新建一个网站就是一个虚拟主机): 可以为不同网站绑定同一个 IP 和端口,然后根据主机头(IIS8 上面改称为主机名)的不同来访问不同的站点。 IIS 也支持虚拟目录: 一个站点的网页的存储位置目录是固定的,而且结构和物理保存网页的磁盘路径相同。 例如: 默认网页的存储位置是 C:\inetpub\wwwroot,当访问 localhost 即访问 C:\inetpub\wwwroot 目录下的 index.html 文件,如果访问 localhost/dir1/ 则访问的是 C:\inetpub\wwwroot\dir1\index.html,访问 localhost/dir2 一般情况下是访问默认目录中的 dir2 目录下的 index.html 文件,但是此处的 dir2 目录指向的是 D:\web\ 目录(甚至是其他的服务器上),这就是虚拟目录。
net stop was /y // Windows Activation Service (WAS) net start w3svc // 万维网发布服务(W3SVC) |
---|
部署出现 502.5 错误,一般是 SDK 版本或者托管模块安装有问题。
原因是单页面应用内容只有一个(一般是 index.html)。这个页面中引入的 js 框架会根据当前访问的 url 去路由到相应的子页面组件(可以理解为页面片段)进行逻辑处理和页面渲染。web 站中并没访问的这个页面资源,所以出现 404。 IIS 中可以使用 URL 重写方案解决该问题:
<system.webServer> <rewrite> <rules> <rule name="React Router Refresh" patternSyntax="ECMAScript" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{HTTP_METHOD}" pattern="^GET$" /> <add input="{HTTP_ACCEPT}" pattern="^text/html" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> </conditions> <action type="Rewrite" url="/index.html" /> </rule> </rules> </rewrite> </system.webServer> |
---|
Nginx 中使用:
try_files $uri /index.html; |
---|
触发时机:
需要 IIS 安装 URL 重写模块。
<system.webServer> <rewrite> <rules> <rule name="REDIRECT TO HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> |
---|
Nginx 中使用:
return 301 https://$server_name$request_uri; |
---|
config.AddApiVersioning(options => { options.ApiVersionReader = new MediaTypeApiVersionReader(); options.AssumeDefaultVersionWhenUnspecified = true; options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options); }); |
---|
调用 API 时,我们就在 Content-Type 或 Accept 中用 application/xxx;v=1.0 使用 1.0 版本的 API。
API 版本控制的另一种常见方法是使用 URL 路径。
var constraintResolver = new DefaultInlineConstraintResolver() { ConstraintMap = { ["apiVersion"] = typeof(ApiVersionRouteConstraint) } }; configuration.MapHttpAttributeRoutes(constraintResolver); configuration.AddApiVersioning(); |
---|
[ApiVersion( "2.0" )] [Route( "api/v{version:apiVersion}/foo" )] |
---|
调用 API 时,请求 https://localhost/api/v2/foo 即可。
public class MappingProfile : Profile { public MappingProfile() { //直接映射 CreateMap<Simple, SimpleDTO>().ReverseMap(); //自定义对应属性映射 CreateMap<Simple, SimpleDTO>().ForMember(dest => dest.属性, opts => opts.MapFrom( src => src.属性操作 )).ReverseMap(); } } |
---|
services.AddDbContext<CustomContext>(options => { options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")); }); |
---|
services.Configure<CustomSetting>(Configuration.GetSection(nameof(CustomSetting))); |
---|
"ConnectionStrings": { "ConnectionString": "Persist Security Info=False;User ID=xxxxxx;Password=xxxxxx;Initial Catalog=[db name];Server=[ip or domain]" } |
---|
其中:
//TODO: (未实现)…… //UNDONE:(没有做完)…… //HACK:(修改)…… |
---|
之后,我们可以在 “视图-任务列表” 使其显示所有带有特殊注释的代码位置。
我们使用 Alt + Shift + ] 可以直接选中光标所在代码的代码块。
我们可以通过编辑 *.csproj 文件,在 PropertyGroup 内添加 LangVersion 元素,值为 latest 即可:
<PropertyGroup> ... <LangVersion>latest</LangVersion> </PropertyGroup> |
---|