1、 webapi允许跨域的增删改查要在web.config中加入以下文字

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
</customHeaders>
</httpProtocol>
</system.webServer>

2、webapi支持特性路由,即在action上可以加上类似 [Route("RoleRights/{id}")]的特性路由,前提条件是要支持特性路由,即在WebApiConfig.cs的register的方法中添加MapHttpAttributeRoutes().这样访问该action的时候就会无视路由表中的路由,访问该路由的正确格式为:网站名称/RoleRights/9.--9表示id。

3、ModelState.IsValid,该属性可以判断当客户端传送实体字段格式不正确时会显示为false.比如action中有参数实体A,A中b字段是整形,你传实体调用action,b你传了个“”,此时该属性值回味false.

4、注意添加webapi时生成的return BadRequest和return Notfound(),返回给web客户端时是做为异常处理的,即调用失败,如果使用jquery会调用error函数。返回的错误也比较明确.省去了自定义格式.

5、有时候我们只是对数据库中的某条已有记录做修改,那可以针对要修改的字段设置如下:

db.FunctionInfoes.Attach(functionInfoNew);
db.Entry(functionInfoNew).Property(x => x.FunctionName).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.FunctionType).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.ParentId).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.FunctionPath).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.Description).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.LastUpdateBy).IsModified = true;
db.Entry(functionInfoNew).Property(x => x.LastUpdate).IsModified = true;
try
{
db.SaveChanges();
}

  

其中ismodified=true表示做save的时候要修改此字段.修改ismodufied之前一定要记得增加db.FunctionInfoes.Attach(functionInfoNew);否则会报错.

6、注意db.FunctionInfoes.RemoveRange(childEntityInfo);和 db.FunctionInfoes.Where(item => item.OwnerId == id).Delete();

的区别,前者不会影响到数据库记录,除非增加db.SaveChanges(),后者的修改直接回影响到数据库记录而不需要做db.SaveChanges().

7、记得每个control要增加一个Options空方法,否则做删除回提示not allowe this method。

public string Options()
{
return null; // HTTP 200 response with empty body }

8、事务包裹是使用using(var dbContextTransaction = db.Database.BeginTransaction())

{....

....}

经查询对于一个context的  db.SaveChanges(),其实已经放在一个事务里边了,具体的可以通过sql profile去跟踪,对于分布式context的可能就要使用scope了.

9、使用entity framework table first的好处就是可对于数据库字段的更改,通过在edmx上右键Update model from database及时更新到程序model上.

对于实体序列化返回的属性,可以使用工具Newtonsoft.Json,自定义返回的名称。比如说实体A中有属性

public string Title { get; set; },,但是渴望序列化后返回的属性名是小写的,那么可以在该属性上加上特性[JsonProperty("title")],即

[JsonProperty("title")]
public string Title { get; set; }

10、Linq to Entity

linq to entity,当有空值时会报错,所以程序里边需要判断是否存在空值,如果存在null必须赋值,此代码赋值“”

from a in db.RoleInfoes
join b in db.UserInfoes
on a.LastUpdateBy equals b.UserId into temp
from tt in temp.DefaultIfEmpty()
select new
{
a.RoleId,
a.RoleName,
FirstName = tt.FirstName ?? "",
LastName = tt.LastName ?? "",
a.RoleDescription,
LastUpdate=a.LastUpdate.ToString()
};

11、因为 DbContext 继承自IDisposable 所以你需要释放资源在使用完dbcontext,如果使用了using就不用以下

方法了.

protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}

12.API action可以针对多个实体采用一个Jobject类型的参数来接收对象,然后再分别在服务端取出,大家可以搜索Json.net的Jobject对象的使用.但是在实际angular调用服务端的过程中会发现,如果使用Get方法来调用Web API的get方法,传过来的JObject参数值是空的,此时可以使用Post的方式来传递,此时就会是有值的了.

相关文章:

13、 WebApi中如果某个action要不受具体actinFilterattribute限制(即不执行该attribute中的具体方法,在做权限控制的时候特别有用),可以给该action增加属性OverrideActionFilters,如下例:

 [OverrideActionFilters]
public IHttpActionResult GetDataPoint() { }

14、 WEBAPI能否提供统一接口提供异常呢,避免异常描述满天飞,答案当然是有的,可以自定义异常属性类并继承ExceptionFilterAttribute,并覆写

OnException 方法,然后就可以捕获各种异常了,如下代码

public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//this exception is DbEntityValidationException
if (actionExecutedContext.Exception is DbEntityValidationException)
{
DbEntityValidationException validationException = actionExecutedContext.Exception as DbEntityValidationException;
StringBuilder sb = new StringBuilder();
foreach (DbEntityValidationResult item in validationException.EntityValidationErrors)
{
foreach(var itemerror in item.ValidationErrors)
{
sb.AppendLine(itemerror.ErrorMessage);
}
}
actionExecutedContext.Response=APIResponseMessage.Create(CommonMessage.Error, message: sb.ToString());
}
else
{
actionExecutedContext.Response = APIResponseMessage.Create(CommonMessage.Error, message: actionExecutedContext.Exception.Message);
}
}

那么什么时候会触发该WebApiExceptionFilterAttribute类中的OnException方法呢,答案就是如果你在action中如果不定义任何捕获异常的逻辑,当

程序运行时出现异常会自动被该方法捕获,如果你在action中有用catch捕获了异常,那么并自行处理了,那么就不会触发该方法。当然,你如果有用 throw ex

来抛出了异常,那么OnException也会捕获到该异常.
 相关参考链接大家可以参考一下文章:

http://www.cnblogs.com/aehyok/p/3446863.html

http://blog.jobbole.com/99858/

16、大家猜一下以下的结果会不会是一样的,其中db是DbContext,DataLensDataPoint是表对应model.

db.DataLensDataPoint.Where(item => item.Name.Equals(dataPoint.Name,StringComparison.CurrentCultureIgnoreCase)) 

db.DataLensDataPoint.Where(item=>item.Name.ToUpper()== dataPoint.Name.ToUpper())

,可能你会说一样,但是其实不一样,第一句中StringComparison.CurrentCultureIgnoreCase根本没起作用,也就是没有忽略大小写,但是第二句使用了ToUpper()确实忽略了大小写,不知道是否与DBA设置database为大小写敏感了有没有关系,还是这是一个bug呢?欢迎大家探讨.

17、在对EF框架中的数据做tracking log的时候可以覆写SaveChangesAsync或者SaveChanges,当时要明白一点:db.DataLensDataPointAFS.Where(item => item.DataPointId == dataPoint.DataPointId).Delete()和

await db.DataLensDataPointUniverseValidationCheck.Where(item => dataPointUniverseId.Contains(item.DataPointUniverseId)
).DeleteAsync();这样的方法数据的改变不会被SaveChangesAsync或者SaveChanges方法中捕捉到,因为这两个方法是Entity Framework的扩展类EntityFramework.Extended中的方法,本身有对数据库直接更改的能力,而不需要SaveChangesAsync或者SaveChanges.

18、当在进行类型转换的时候,发现一个问题,当T时dynami类型时如果使用Type type = typeof(T)来获取类型之后,然后使用type.GetProperties()来获取属性,获取属性就会失效.这时候只能使用真实类型.

restful标准描述

http://www.cnblogs.com/artech/p/restful-web-api-02.html

webapi分页

微软Odata 技术
 

webapi+entityframework分享的更多相关文章

  1. webapi - 使用依赖注入

    本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...

  2. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  3. 【无私分享:ASP.NET CORE 项目实战(第三章)】EntityFramework下领域驱动设计的应用

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们 [无私分享:从入门到精通ASP.NET MVC] 系列中,我们其实也是有DDD思想的,但是没有完全的去实现,因为并不是 ...

  4. csc.rsp Nuget MVC/WebAPI、SignalR、Rx、Json、EntityFramework、OAuth、Spatial

    # This file contains command-line options that the C# # command line compiler (CSC) will process as ...

  5. csc.rsp Nuget MVC/WebAPI 5.0、SignalR 2.0、Rx、Json、Azure、EntityFramework、OAuth、Spatial

    # This file contains command-line options that the C# # command line compiler (CSC) will process as ...

  6. 分享一个简单程序(webApi+castle+Automapper+Ef+angular)

    前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMa ...

  7. 【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi

    一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年a ...

  8. C# WebAPI分页实现分享

    第一次分享代码,不足或不对之处请指正.. 需求:微信端传递不同的参数调用WebAPI进行分页查询菜谱计划点评结果 思路:基于视图来查询,根据传递的不同参数拼接分页查询Sql来查询. 分页的sql如下 ...

  9. H5+.Net Webapi集成微信分享前后端代码 微信JS-SDK wx.onMenuShareTimeline wx.onMenuShareAppMessage

    说明: 1/因为赚麻烦这里没有使用数据库或服务器缓存来存储access_token和jsapi_ticket,为了方便这里使用了本地的xml进行持久化这两个值以及这两个值的创建时间和有限期限. 2/每 ...

随机推荐

  1. HyperDock,让Mac的窗口飞

    三年前写了一篇文章,介绍了Windows 7下的Aero效果,其实最终是想引出来写Mac OS上能产生类似功能的HyperDock应用程序,可惜这一拖,就拖到连Windows 10都快要发布了.没有关 ...

  2. 初识jsonp

    jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案.很多时候我们需要在客户端获取服务器数据进行操作,一般我们会使用ajax+webservice做此事,但是如 ...

  3. Linux网络编程系列-套接口选项控制

    获取和设置套接口选项的方法有: getsockopt/setsockopt fcntl ioctl getsockopt/setsockopt 这两个函数仅用于套接口(socket)的设置,另外两个函 ...

  4. CCNA网络工程师学习进程(2)基本的网络设备

      在组网技术中用到的设备有中继器(Repeater).集线器(Hub).网桥(Bridge).交换机(Switch).路由器(Router).分别工作在OSI参考模型中的物理层.数据链路层和网络层. ...

  5. 编译原理:正规式转变成DFA算法

    //将正规式转变成NFApackage hjzgg.formal_ceremony_to_dfa; import java.util.ArrayList; class Edge{ public int ...

  6. java中的显示初始化和特定初始化

    public class Test{ public static void main(String[] args){ Child child = new Child(); } } class Pare ...

  7. 基于PHP实现阿里云开放存储服务

    开放存储服务(OpenStorageService,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务.用户可以通过简单的API(REST方式的接口),在任何时间.任何地点.任何互 ...

  8. HTML5的学习--performance

    HTML5提供的performance接口精确的告诉我们当访问一个网站页面时当前网页每个处理阶段的精确时间(timestamp),以方便我们进行前端分析. 它是浏览器的直接实现,比在网页中用js设置D ...

  9. .Net Request.Form含有危险字符的处理办法

    今天我们的网站遇到一个问题,下标就类似于化学分子式这样的是需要用"<sub></sub>"这个标签括起来的,当时没有转义,有部分标签就显示不出来了, 后来我 ...

  10. PHP API接口测试小工具

    前端时间给手机客户端做接口,当时弱爆了,写完API接口后,也不怎么测试,最后是等客户端调用的时候检验API的正确性. 后面利用PHP的curl实现Post请求,检验API接口的正确性:配合前面做的一个 ...