起因

  1. 工作的缘故,虽然很不喜欢.net的东西,但是不得不去做一些。之前一种使用wcf这样很重的框架,又不跨平台,最近接触了MVC,还是很有趣的,然后就把之前整套框架都拆解出来做成webapi。

  2. 主要还是记录一些会遇到的问题,至于什么概念什么的,百度一下都会有的。

环境和定义

  1. RESTFUL风格。这个就没啥可说的
  2. ORM层用的EF code First 持久层用SQL。因为有一部分数据存在了hbase之中,先使用nodejs做一个中间层,之后会考虑直接用调用。
  3. IOC 用的ninject,看到有人用Unity和Castle。之后会考虑更换。
  4. 当然还有一个简单的ef代码生成器。属于内部资源。

库管理

  1. 刚好这周听内核恐慌讲的就是库管理的事情。我的开发环境是VS2012, .Net的版本是4.5。管理当然是Nuget。确实很有好处,有一些类库从别的项目拖过来的,直接更新下nuget就能把所有依赖的包都下载完全。
  2. 还是要注意MVC4的库版本,我创建项目的时候用的是MVC4的默认版本,他引入的ef是5.0的版本,而目前是6.1.2 直接使用会报错。很好解决,使用nuget直接更新就好了。
  3. 路由和view都好懂,还内置了boostrap和jq。看懂路由之后之后写起来就很方便,一个简单的例子一个小时就能弄完。

发布

  1. 因为整个项目其实就是一个人。所以在写完demo之后我立马拖到生产环境上测试了。注意service的.net版本。
  2. 发布很简单,不管是ftp还是文件系统。
  3. 但是访问的时候确实403。也不报错,本地调试无问题,显示没有可显示目录,如果把目录列表打开,怎无法获得任何资源。
  4. 经过大量的百度无果,然后找了google,stackoverflow。有如下几种解决方案。个人觉得都是可存在的可能

    1. <system.webServer>
          <modules runAllManagedModulesForAllRequests="true"/> 
      </system.webServer>
      
    2. window hotfix,如果你是Windows Server 2008 R2 并且很久没给服务器打补丁了,试试这个hotfixUpdate for Windows Server 2008 R2 x64 Edition

      我查了将近3个小时就是用这个解决的,因为服务器在内网。从来没有生过级。。。

    3. 还有一种就是iis 和 asp.net 安装顺序的问题,至于那个在前,我也确实母鸡,只是要注册一下asp.net就行。链接

错误输出

  • custonErrors 这个配置在上了生产环境之后就看不到详细错误了。
  • 而且webapi错了,就只会给你一个500.找了一圈找了一个解决方案

    返回来的xml只有一句话
    -<error>
        <message>发生错误。</message>
     <error>
    
  • 解决代码:

    try
    {
        ...
    }
    catch (Exception e) {
    //在webapi中要想抛出异常必须这样抛出,否则之抛出一个默认500的异常
        var resp = new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent(e.ToString()),
            ReasonPhrase = "error"
        };
    throw new HttpResponseException(resp); 
    }
    

分发和内容

  • 我只有一个对公的ip,所以需要一个分发服务器。
  • 目前考虑使用nginx+iis,通过域名来区分。但是配置了一下午,卡在nginx监听80端口,可能和自己的网络供应商有关。

大致如此。