Asp.Net Mvc3在Mono中部署的两个问题

来源:未知 责任编辑:智问网络 发表时间:2013-09-26 23:49 点击:

 

  在尝试把MVC3项目部署在mono(2.10)上时,发现两个问题,一个是MVC3所有Action中来自ModelBinder的实体都为null,另一个是Lucene.Net遭遇“UNC paths should be of the form \\server\share”错误。

 

    对于问题1,经过实验,发现mono下只要是post请求,就无法通过Request获取值,因为Request.Form.Keys.Count总是为0,抛开apache直接运行xsp4也存在同样的问题,由于MVC版HttpContext的获取在MVC3的相关类库中进行,而System.Web.Mvc是私有部署的,所以问题要么发生在mono的System.Web的实现中,要么发生在XSP中,经过了痛苦的搜索,有人提到mono中不能使用DefaultModelBinder,也有人提到mono当前还不足以完全支持MVC3,但如果HttpContext中根本就没有初始化POST请求的数据,无论谁的ModelBinder都无法拼出一个Model来。后来,终于在mono的BUG更正列表中发现了一些蛛丝马迹,在mono 2.10.2的Release notes页,BUG683339提到:

683339: POST variables are not transferred to HttpContext.Request.Params nor FormCollection in MVC3 app

    怪不得,mono2.10.2之前的版本中,POST数据都无法在MVC3中读取,在更新了mono2.10.2后,ModelBinder果然正常工作。

 

    对于问题2,则是windows和linux下路径的"\"和"/"的差异引起的IO异常,其实从windows环境下迁移到linux+mono中时,有80%的问题都集中在URL大小写和windows/linux的路径问题上。这个异常向上追踪可在Stack Trace中看到这样一条信息:www.2cto.com

at PanGu.Dict.WordDictionary.LoadFromBinFile (string,string&) <IL 0x00014, 0x00089>

    推测是盘古分词在读取词典时的路径中使用了硬编码的路径分隔符,通过Reflector定位到该方法,果然看到了这样的代码:

public string GetDictionaryPath()

{

    string dictionaryPath = this.DictionaryPath;

    string currentDirectory = Directory.GetCurrentDirectory();

    Directory.SetCurrentDirectory(Path.GetAssemblyPath());

    dictionaryPath = Path.GetFullPath(dictionaryPath);

    Directory.SetCurrentDirectory(currentDirectory);

    return Path.AppendDivision(dictionaryPath, '\\'); //<----------此处使用了硬编码的路径分隔符

}

    于是下载了盘古分词的源码,更改其中的词典路径为从配置文件中读取,重新编辑部署了Pangu.dll后,果然可以正常搜索。这也教训我们,应该养成良好习惯,尽可能少地使用硬编码,多考虑代码在多环境下的适用性。

    以上是使用mono的点滴Debug经验,可能有很多人也会遇到同样的问题,希望有所帮助。

    顺道宣传一下,经过多轮压力测试,发现其实mono的性能一点也不差,如果真有疑惑,相信科学,相信实验,自己试试就知道了。

 

摘自 Windvoice 聆风之音

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • asp.net 设置GridView的选中行的实现代码
    • C#高级编程:数据库连接[1]
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET&#160;GridView列表代码示例
    • Asp.net MVC源码分析--Action Filter的链式调用
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1