小编Kau*_*eta的帖子

System.Addin - 创建安全的ASP.NET MVC插件

最近我的重点是创建一个可以托管第三方MVC插件的ASP.NET MVC应用程序.理想情况下,这些插件的开发将遵循以下规则:

  1. 插件可以在标准MVC项目中开发,并且能够使用ASP.NET MVC框架的所有现有基础结构.
  2. 编译插件MVC项目并包含到主机MVC应用程序中的复杂性不应该很严重.
  3. 对MVC应用程序的正常开发流程的任何更改都将是最小值

经过一番研究后,我想出了以下几种方法来实现这一点,每种方法各有优缺点.

方法1 - 将MVC插件程序集加载到主MVC AppDomain中

工作流程

  • 在单独的MVC项目中开发插件.
  • 编译组件和它和任何依赖关系加载到经由所述主机应用程序PreApplicationStartMethodAttribute,MEF或主机项目中的基本组件参考(如果可能).
  • 将路由映射到插件控制器,以便将插件视为Area主机内的插件.
  • 将插件视图放入正确的区域文件夹中.需要更改布局文件,以便布局路径指向基于区域的位置,而不是应用程序的根(在开发MVC项目中就是这种情况)
  • 当插件的请求进入时,ASP.NET将使用现有区域功能将请求路由到正确的控制器并查看视图文件的正确位置.

好处

  1. 将无缝地工作,就好像控制器嵌入在主机MVC应用程序组件中一样.
  2. 在应用程序启动(PreApplicationStartMethodAttribute,项目引用)之前和应用程序启动之后(MEF),将程序集包含到主机App Domain中很简单

缺点

  1. 没有沙盒 - 控制器将具有与主机相同的信任级别.

结论

这是最简单的方法,但它也是最不安全的方法.它基本上消除了允许不受信任的开发人员创建插件的可能性,因为这些插件将具有与宿主应用程序相同的信任级别(这意味着如果宿主应用程序可以执行诸如System.IO.File.Delete插件之类的方法)

方法2 - 通过MAF在自己的AppDomain中运行的MVC插件程序集

这种方法旨在允许创建可以沙箱化为自己的MVC插件,AppDomains并由主机通过System.Addin库使用.

结构体

  1. 在主机中设置路由,以确定正在处理的URL是否针对插件.可能有这样的模式example.com/p/{plugin}/{controller}/{action}/{id}

  2. 具有上述模式的所有路由都映射到具有模块路由操作的主机控制器.该操作会查看任何给定的路由,并根据段确定处理请求的相应插件{plugin}.

  3. 插件视图是一个接收器/发送器对象,充当插件控制器的网关.它有一个名为AcceptRequest的方法,它RequestContext从主机接收a ,并返回一个ActionResult.

  4. 插件管道包含可以串行化RequestContextActionResult跨管道隔离边界传输的适配器.

执行流程

  1. 匹配插件的路由并调用插件路由控制器.

  2. 控制器将所需的插件加载到它自己的插件中AppDomain并调用AcceptRequest,通过RequestContext(通过管道序列化)

  3. AcceptRequest接收上下文并根据该请求确定要执行的适当控制器(使用自定义控制器工厂).

  4. 一旦控制器完成执行请求,它就会ActionResult向接收器对象返回一个接收器对象,然后将该接收器对象 …

asp.net asp.net-mvc plugins appdomain

25
推荐指数
1
解决办法
1792
查看次数

在openxml中向Excel添加样式

我想在打开的 Excel 文档中设置文本的前景色以写入文本。

为此我尝试过:

var stylesheet1 = spreadSheet.WorkbookPart.WorkbookStylesPart.Stylesheet;

                Fills fills1 = new Fills() { Count = (UInt32Value)5U };

                Fill fill5 = new Fill();
                PatternFill patternFill5 = new PatternFill() { PatternType = PatternValues.Solid };
                ForegroundColor foregroundColor3 = new ForegroundColor() { Rgb = "#FF0000" };
                patternFill5.Append(foregroundColor3);

                fill5.Append(patternFill5);

                fills1.Append(fill5);

                stylesheet1.Fills.Append(fills1);
                var fid = stylesheet1.Fills.Count++;         

                wbsp.Stylesheet = stylesheet1;

                Row excelRow;
                excelRow = new Row();
                excelRow.RowIndex = 0;

                Cell cell = new Cell()
                {
                    //create the cell reference of format A1, B2 etc
                    //CellReference = …
Run Code Online (Sandbox Code Playgroud)

.net c# excel openxml

4
推荐指数
1
解决办法
1万
查看次数

如何在asp.net中默认选择一个单选按钮

我有一个单选按钮,我想默认默认选中第一项.我该怎么做呢?下面是单选按钮的源代码.

<asp:RadioButtonList ID="radRiskLevel" runat="server" RepeatDirection="Horizontal">
     <asp:ListItem Value="High">High</asp:ListItem>
     <asp:ListItem Value="Mid">Mid</asp:ListItem>
     <asp:ListItem Value="Low">Low</asp:ListItem>
</asp:RadioButtonList>
Run Code Online (Sandbox Code Playgroud)

c# asp.net

2
推荐指数
2
解决办法
1万
查看次数

在 MySQL 中不使用 LIMIT 和 OFFSET 的存储过程中的分页。

我必须创建一个存储过程来使用 MySQL 中的 LIMIT 获取分页数据。它在我的本地数据库中运行良好,但在服务器上不起作用。所以我尝试在 google 中搜索并获得解决方案“升级服务器上的 phpmyadmin 版本”,但这是不可能的。因此,在没有 LIMIT 或 OFFSET 的情况下创建分页的任何替代方法。?

在我尝试过的代码下方。

CREATE DEFINER=`root`@`localhost` PROCEDURE `LazyLoadScope`(IN ClientId INT,IN StartIndex INT,IN Count INT)
BEGIN

DECLARE LowerBound  INT;
DECLARE UpperBound  INT;
DECLARE rownum  INT;
SET LowerBound = ((StartIndex - 1) * Count) + 1;
SET UpperBound = ((StartIndex - 1) * Count) + Count;

SELECT scopeid,scopename,clientid,scope,createddate,ViewDate,IsLocked
FROM scopemaster as sm  inner join clientmaster cm on cm.clientid=sm.clientid
where cm.userid=ClientId order by sm.ViewDate desc LIMIT LowerBound,UpperBound ; 

END
Run Code Online (Sandbox Code Playgroud)

mysql pagination

1
推荐指数
1
解决办法
5353
查看次数

标签 统计

asp.net ×2

c# ×2

.net ×1

appdomain ×1

asp.net-mvc ×1

excel ×1

mysql ×1

openxml ×1

pagination ×1

plugins ×1