Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于ASP.NET MVC 3替代php网站的一些架构建议_C#_Php_Asp.net Mvc 3_Content Management System - Fatal编程技术网

C# 关于ASP.NET MVC 3替代php网站的一些架构建议

C# 关于ASP.NET MVC 3替代php网站的一些架构建议,c#,php,asp.net-mvc-3,content-management-system,C#,Php,Asp.net Mvc 3,Content Management System,我正在重写一个web(应用程序?)。我会试着简单地安排一下(哈哈)。我客户的网站内置CMS。大部分是静态内容。该网站托管在某个地方,但有一个登录区域,供客户跟踪其订单和存储在我的客户服务器上的其他动态业务内容。认证在双方都进行(php cms管理会话,但业务逻辑和客户数据(包括密码)驻留在客户机数据库中的客户机服务器上,并通过wcf提供)。对wcf webservice的每个php请求都会发布一个json身份验证字符串,如果经过身份验证,我的wcf webservice将返回一个json结果,该

我正在重写一个web(应用程序?)。我会试着简单地安排一下(哈哈)。我客户的网站内置CMS。大部分是静态内容。该网站托管在某个地方,但有一个登录区域,供客户跟踪其订单和存储在我的客户服务器上的其他动态业务内容。认证在双方都进行(php cms管理会话,但业务逻辑和客户数据(包括密码)驻留在客户机数据库中的客户机服务器上,并通过wcf提供)。对wcf webservice的每个php请求都会发布一个json身份验证字符串,如果经过身份验证,我的wcf webservice将返回一个json结果,该结果将填充请求的数据(然后与smarty模板一起使用,以生成cms发送到浏览器的输出)

这一切都很好,除了php代码是不朽的意大利面条。事实上,按照php标准来说可能还不算太糟糕,但我已经习惯了。。。好吧,谁在乎呢,因为归根结底,我没有写它,但我必须对它进行扩展,每次修改所花费的时间是它应该花费的时间的10(0?)倍,而且只会把草堆淹没在更多的面条中(混合隐喻)。更糟糕的是,在它们上线之前没有任何测试更改。必须在生产环境中进行任何更改或添加(由于依赖于CMS环境)。因此,我必须将闪电战战术与编辑和祈祷相结合,并将第11个手指放在众所周知的“恢复”按钮上(如果只是恢复的一步,那不是很好吗?)。我曾多次尝试重构php端,甚至编写了大约75%的完整重新实现。但是

此web应用程序正在获得越来越多的责任和更改请求。对于这个客户,我已经用C#编写了一个500000行的ERP,他们的所有业务逻辑都在其中。所以,我认为将他们的所有代码都放在.NET中,对我或任何跟随者来说,都有一个明确的ROI

任何解决方案唯一的实际约束是,无论CMS显示什么,都必须附加到变量“$output”中。这让事情变得相当开放

无论如何,(通常是多余的,但希望是乏味的娱乐)叙事已经完成。因此,我建立了一个简单的php包装器,它使用cURL获取由我的新mvc应用程序支持的url的内容。这对get很有效。我的问题是,进行这项工作的最佳方式是什么。来自cms端的每个请求都需要包含一些身份验证信息,这些信息将从数据库(或任何东西)中检索并与请求一起发布。我想我会拆掉wcf Web服务,从mvc应用程序中提供所有内容

那么,基本上,编写mvc应用程序的最佳方法是什么,其中每个请求都是包含身份验证信息的帖子(可以是json或xml)?我试图避免用[HttpPost]装饰每个控制器方法,并让每个操作方法都需要身份验证dto的参数,以便在某个时候可以快速轻松地将所有身份验证切换到asp表单身份验证


谢谢你的阅读

实现您自己的操作过滤器,它将集中检测当前登录的用户,并将其应用于您的函数参数。 大概是这样的:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class UserIDFilter : ActionFilterAttribute
{
    public bool Require { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (Require)
        {
            if (Membership.GetUser() == null)
            {
                string formsAuthenticationToken = HttpContext.Current.Request.Form["cookie"];
                if (!string.IsNullOrEmpty(formsAuthenticationToken))
                {
                    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(formsAuthenticationToken);
                    if (ticket != null)
                    {
                        FormsIdentity identity = new FormsIdentity(ticket);
                        string[] roles = Roles.GetRolesForUser(identity.Name);
                        GenericPrincipal principal = new GenericPrincipal(identity, roles);
                        HttpContext.Current.User = principal;
                    }
                }
                if (Membership.GetUser() == null)
                    throw new UserNotAuthenticatedException();
            }
        }
        const string key = "userId";
        if (filterContext.ActionParameters.ContainsKey(key))
        {
            if (Membership.GetUser() != null)
                filterContext.ActionParameters[key] = (Guid)Membership.GetUser().ProviderUserKey;
            else
                filterContext.ActionParameters[key] = (Guid?)null;
        }

        base.OnActionExecuting(filterContext);
    }
}
然后用以下内容装饰每个动作:

[UserIDFilter]
(and the action will have 1st parameter: Guid? userId)


我们对您的CMS一无所知,对您的应用程序一无所知,对您的体系结构一无所知,对您的ERP一无所知。。。在不知道任何事情的情况下,给出有意义的答案有点困难

Ofer试图给你一个解决方案,但根据你的回答,缺乏可用的信息并不能帮助他对你要找的东西做出正确的假设

想象一下如果有人带着你的问题来找你,想象一下你对此一无所知。。你能明白你的意思吗


另外,我知道你可能觉得你的写作很有趣,也许是。。但你似乎比问你的实际问题更努力地让自己变得有趣。回答问题的人往往更喜欢你尽量让他们回答得更容易,而不是相反。

这似乎是其中一种情况,在这种情况下,“对拿锤子的人来说,一切都像钉子”这句话非常适用。当您声明“CMS”代码是意大利面条时,您无法阻止自己对php添加一个不太微妙的挖苦,尽管事实并非如此,因为就您而言,php=意大利面条

请不要装出受伤的感觉,因为有人打电话给你,说你所谓的问题比实际的相关技术细节或具体问题更能描述你的完美世界


除了对.NET脚本进行CURL调用之外,使用PHP的体系结构是荒谬的。既然你的日程安排明确,为什么还要浪费我们的时间呢。去向你的客户说明为什么他们在微软技术堆栈上的投资比其他任何东西都要大得多,让他们将该堆栈扩展到前端是有意义的。在PHP世界中,我们有很多优秀的框架提供MVC。很明显PHP不在您的舒适区,在这种情况下,向客户说明混合解决方案不能很好地为他们提供服务似乎是很合理的。

我为你的客户感到难过。你为什么为我的客户感到难过?因为你不明白我为什么为你的客户感到难过。又是那个花瓶。我想那是一种侮辱?如果是的话,你能告诉我吗?或者我是一个失败的原因?我希望在接收cms端的请求开始时插入一个解决方案,该解决方案将验证并允许请求
[UserIDFilter(Require=true)
(and the action will have 1st parameter: Guid userId)