我正在构建一个asp.net mvc应用程序,用户可以将图片附加到他们的个人资料中,也可以在系统的其他区域附加,例如仪表板上显示最近消息等的消息小工具.
当用户上传这些内容时,我想知道将它们存储在数据库或磁盘上是否更好.
数据库优势
易于备份整个数据库,并保留配置文件内容/图像与相关的配置文件/用户表
当我稍后在轨道上构建Web服务时,他们可以从一个位置(数据库)中提取所有与profiile相关的数据
文件系统的优点
从磁盘加载文件可能更快
还有其他什么好处
其他网站在哪里存储此类信息.对于类似这样的事情,我是否有点担心数据库性能?
也许有一种方法可以缓存从数据库中提取的图像一段时间?
或者,将这些图像存储在数据库中的想法如何,但是将它们复制到磁盘,以便Web服务器可以从那里加载它们?这似乎既提供了Db的备份和便利,同时提供了磁盘上文件的速度优势.
有问题的基础设施
摘要
在SO上阅读很多相关的线程,许多人现在趋向于SQL Server Filestream类型.然而,从我可以收集的内容(我可能是错的),当文件非常小时,没有太大的好处.然而,当文件是多个MB或更大时,文件流看起来会大大提高性能.
由于我的个人资料图片往往约为5kb,我决定将它们作为varbinary(max)存放在数据库的文件存储中.
在ASP.NET MVC中,我确实看到了一些性能问题,返回FileContentResults从这样的数据库中拉出的图像.所以如果在我的应用程序缓存中找不到该文件的位置,我最终会在磁盘上缓存该文件.
所以我想我选择了混合动力车;
在任何时候我都可以删除磁盘上的缓存文件夹,并且当重新请求图像时,它们将在第一次命中时被重新复制并在之后从缓存中提供.
传统上我总是手工编写我的sql脚本,所以它们很好而且干净(我不是生成者的粉丝)并且发布到发布版本,我提供了一个全新的安装脚本和来自之前版本的迁移脚本表,改变现有的表等.这都非常标准.
我没有太多时间来使用EF 4代码,但如果它在生产环境中实际可行,我很有兴趣使用它.
假设你有一个代码优先的方法,如果一个数据库不存在,将自动创建一个数据库.如果您发布具有架构/模型更改的软件的新版本会发生什么.EF是否足够智能更新数据库模式以匹配更新的EF模型?
脚本
代码首先仅对初始部署有用,还是足够聪明以更新现有数据库版本以便像这样发布?
asp.net-mvc entity-framework entity-framework-4 ef4-code-only
问题
ASP.NET MVC 3 RC在运行时(浏览时)向外部MVC区域发出编译错误.网站本身有效,但插件拒绝加载抛出与未知模型有关的编译问题.
LogOn.cshtml
@model TestProject.Models.LogOnModel
@{
View.Title = "Log On";
}
//.....omitted for brevity
Run Code Online (Sandbox Code Playgroud)
运行时抛出错误.
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS0103: The name 'model' does not exist in the current context
Source Error:
Line 38: public override void Execute() {
Line 39:
Line 40: Write(model);
Line 41:
Line 42: … 我想知道在asp.net mvc 3 RC中提交表单时如何实现多个表单操作.
如果我正在编辑用户,例如我想要一个带有以下按钮的操作栏;
"保存"| "保存并关闭"| "取消"
保存 - 提交表单并保存,返回编辑屏幕.可以轻松实现为标准输入/提交按钮.这里没什么特别的.
这可能是控制器代码
public ActionResult Edit(UserViewModel model)
{
...
return RedirectToAction("Edit", model.Id");
}
Run Code Online (Sandbox Code Playgroud)
取消 - 只需返回上一屏幕即可.我正在考虑为此使用锚标签.
<a href="@Request.UrlReferrer" class="button">Cancel</a>
Run Code Online (Sandbox Code Playgroud)
但是当你需要提交相同的表单数据时,我很难理解如何实现"保存并关闭".我想知道有一个可以为空的关闭参数吗?
public ActionResult Edit(UserViewModel model, bool? close)
{
...
return close.GetValueOrDefault(false) ? RedirectToAction("Index", model.Id" : RedirectToAction("Edit", model.Id");
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,如何将此额外参数与表单一起提交?
如果可能的话,我想在上面的模型中使用单个表单操作来处理提交.
我也很感兴趣,如果有其他人提出了一个很好的用户交互模型围绕这个想法.
解
我最终使用了Omar的建议,但是我没有传入一个字符串,而是接受了枚举,所以我不需要在所有控制器中进行字符串检查.
public ActionResult Edit(UserViewModel model, FormAction actionType)
{
// pre-check
if (actionType == FormAction.Cancel)
// just return user to previous view and don't save.
// Save code
if …Run Code Online (Sandbox Code Playgroud) 有很多关于设置asp.net成员资格,角色提供者等的问题(和信息).您是否应该使用microsoft提供的内置平台,或者角色扩展您自己的基类和角色.
我决定扩展默认提供程序并实现我自己的成员资格和角色提供程序.现在我的问题,特别是围绕角色身份验证.
传统上,您可以创建角色,例如"经理,管理员,员工,超级用户"或任何您拥有的角色.但是对于我认为是更精细控制的权限,您应该/应该做什么?让我详细说明......
在我的asp.net mvc网站中,我有不同的领域,如管理,管理,消息传递,报告等.我会为"管理员","经理","报告者"等各个角色创建角色.如果没有相应的角色,您可以无法访问该网站的该区域.所以我会在类级别锁定整个控制器.
但现在以一个地区为例; 消息,并说我想为CRUD获得更好的谷物权限; 创建消息,查看/阅读消息,编辑消息,删除消息等.
最后我的问题.如何实现这种更精细的控制?我看到的一种方法(不确定它是否是一个好方法),就是为所有东西创建asp.net成员角色.所以我可能......
Messenger(广义级角色),CreateMessage,ReadMessage,EditMessage,DeleteMessage.
一方面,我希望一些用户能够阅读/查看消息.但不一定要创建或删除它们.单个控制器操作可以应用特定角色.
你觉得这种方法有什么问题吗?你有更好的主意吗?
迄今解决方案
我决定创建自己的架构并实现自定义成员资格和角色提供程序.我的架构包括;
将在第二天或第二天离开,但是当我有机会时会更新更多信息.
asp.net-mvc asp.net-membership asp.net-authentication asp.net-roles
我一直在oauth2上进行一些搜索,并认为它可能非常适合我正在构建的一些WCF休息服务,这些服务将由一些WPF应用程序和MVC Web应用程序使用.其想法是最初要求用户使用他们的用户名/密码登录并接收访问令牌,该访问令牌使他们能够访问上述资源.
在这里搜索SO我没有找到关于oauth2的更多信息,除了一些与Facebook等消费者相关的问题.
我想知道是否有人可以提供一些实施oauth2的技巧(或者知道任何好的资源).我对提供者(身份验证和发布访问令牌)以及客户端/消费者端感兴趣.
.NET OAuth2库
我找到的唯一的OAuth2库来自dotnetopenauth,它似乎也很重要.在这个阶段,我宁愿一个更轻一点的图书馆,而且只是包含了oauth2
还有其他oauth2库吗?