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

本文关键字:MVC NET 替代 网站 php 构建 ASP 关于 | 更新日期: 2023-09-27 18:03:10

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

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

这个web应用程序得到越来越多的责任和变更请求。对于这个客户,我用c#写了一个50万行的ERP,所有的业务逻辑都在其中。所以,我认为把他们所有的代码都放在。net中是有明确的投资回报率的,对我或任何追随他们的人来说。

任何解决方案的唯一真正约束是CMS要显示的内容必须附加到变量"$output"。这让事情变得非常开放。

无论如何,(通常是多余的,但希望是有趣的)叙述是完整的。因此,有了这个,我已经设置了一个简单的php包装器,它使用cURL来获取由我的新mvc应用程序支持的url的内容。这对get来说很好。我的问题是什么是最好的方法。cms端的每个请求都需要包含一些身份验证信息,这些信息将从数据库(或其他)中检索并随其请求一起发布。我想我会蚕食wcf webservice,并从mvc应用程序中提供所有内容。

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

谢谢(阅读)!

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

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

[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)

[UserIDFilter(Require=true)
(and the action will have 1st parameter: Guid userId)

我们对你们的CMS一无所知,我们对你们的应用一无所知,我们对你们的架构一无所知,我们对你们的ERP一无所知…在一无所知的情况下,很难给出有意义的答案。

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

想象一下,如果有人带着你的问题来找你,而你什么都不知道……你能明白你的意思吗?

而且,我知道你可能觉得你的写作很有趣,也许它是…但你似乎花了更多的精力让自己变得有趣而不是问你真正的问题。那些回答问题的人往往更喜欢你尽可能让他们简单地回答问题,而不是相反。

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

请不要假装受伤,因为人们已经指出你所谓的问题包含了更多的叙述,描述了在你的完美世界里会是什么样子,而不是实际的相关技术细节,或者具体的问题。

使用PHP除了对。net脚本进行CURL调用之外别无其他用途的架构是荒谬的。既然你的计划很明确,为什么还要浪费我们的时间。去告诉你的客户,为什么他们在微软技术堆栈上的投资比其他任何东西都要大得多,所以他们把这个堆栈扩展到前端是有意义的。PHP世界中有很多提供MVC的优秀框架。很明显,PHP不在您的舒适区,在这种情况下,向客户说明混合解决方案不能很好地为他们服务似乎是合乎逻辑的。