总结
主要是还是对概念和写法不够了解,吃了之前复制黏贴的亏,好多小的地方卡了不少时间,今天主要是解决调用API跨域,和一些继承问题。
API跨域
跨域是指,浏览器处于安全考虑会禁止一个javaScript脚本和其他域的内容进行交换,可通过CORS处理跨域问题,全称Cross-Origin Resource Sharing,中文全称跨域资源共享。它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求。
用VS搜索并安装:Microsoft.AspNet.WebApi.Cors
然后通过设置WebApiConfig.cs来读取配置文件进行跨域设置,当然也可以直接写死,可以写*号允许所有,但是最好不要,也可以用“,”逗号分割来设置多个。
谷歌浏览器默认会为请求添加Orgin属性
methods:允许请求的方法 GET,POST,PUT,DELETE 这些
Origin:允许请求的域名
Headers:允许请求的头部,对应content-Type的选项,
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Cors;
namespace test
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//设置
string allowedMethods = ConfigurationManager.AppSettings["allowedMethods"];
string allowedOrigin = ConfigurationManager.AppSettings["allowedOrigin"];
string allowedHeaders = ConfigurationManager.AppSettings["allowedHeaders"];
config.EnableCors(new EnableCorsAttribute(allowedMethods, allowedOrigin, allowedHeaders));
}
}
}
Web.config
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="allowedMethods" value="*" />
<add key="allowedOrigin" value="127.0.0.1" />
<add key="allowedHeaders" value="*" />
</appSettings>
C#类的问题
先解决了一个昨天没有弄明白的问题,
首先变量是变量,属性是那些{get;set;}封装起来的字段。
类中不能声明变量等于变量,因为字段的初始化优于构造函数,
string a = b;其实等于string a = this.b;因为构造函数还没执行,所以this也就还没有被定义。
以下代码也就当然会报错
public class testb
{
Test testclass = new Test();
string name = testclass.Name;
}
public class Test
{
public string Name = "2";
public string Age = "1";
}
写法问题:继承
构造函数不会被继承!!!
如果基类有泛型属性,派生类继承时候要不也定义泛型类或者直接定义具体类型;
public class A<T>
{
public T Data { get; set; }
}
public class B : A<int>
{
}
public class C<T> : A<T>
{
}
如果基类定义了构造函数使初始化时确认泛型实际类型,派生类需要在构造函数中通过base来传入实参,具体写法如下,int a是子类中构造函数需要,T data是父类中构造函数需要。
因为继承父类,再给父类分配内存后调用构造函数,所以需要给父类的构造函数传递实参。
执行顺序父类构造函数,子类构造函数。
有时间要研究下静态成员,实例成员的初始化顺序。
List<> Object 等没有实例化是null.
不可以通过 data.Add(),data.cont = 1;来直接赋值。需要先new 实例化。
public class A<T>
{
public A(T data)
{
this.Data = data;
Console.WriteLine("父亲");
}
public T Data { get; set; }
}
public class C<T> : A<T>
{
public C(T data,int a) : base(data)
{
Console.WriteLine("儿子");
}
}
今天买的Java的入门书籍到了,都说会Java的人入手C#贼简单,哥们就来个反向进军Java界。
手动狗头!