.net 开发中对ASHX文件用处的疑问

天道酬勤_MWH 2014-09-04 06:46:38
我对.NET开发的经验还稍浅,以前是开发JAVA的.可能由于能力问题现在对很多基础概念理解不深。处于能开发,但是不能有效率高质量的开发。对于ashx文件我们技术总监给我的建议,也是浅显易懂。大部分的时候用来处理ajax的程序代码。但是我深深受那种action的思想,总觉得它这个类和java的action类似乎能做一样的事情,于是就把它写成了这个样子。业务逻辑,页面跳转都能正常的跳转。也能正常的登录和注销。总而言之这样子是能跑的起来的。
但是我想知道我这样写代码的弊端在哪里。或者说有致命的问题,那么我肯定就要把它改正了。
然而我们这个项目 有很多模块都需要登录,有点整合的意味。所以我一定要把表单处理给通用化。
不能写在页面的cs类里面、

//我前台是依靠 UserAction.ashx?Method=UserNameLogin 这样的action值把参数提交过来的
然后调用业务逻辑层做操作,最终返回结果跳转页面。


<%@ WebHandler Language="C#" Class="UserAction" %>

using System;
using System.Web;
using System.Web.SessionState;

public class UserAction : IHttpHandler,IRequiresSessionState{

private HttpContext Mcontext;
private string FromUrl;

public void ProcessRequest(HttpContext context) {

context.Response.ContentType = "text/html;charset=utf-8"; ;
Mcontext = context;
string Method = context.Request["Method"];
FromUrl = context.Request.ServerVariables["HTTP_REFERER"];//保存从何页面发送来的请求,权限不通过则返回

switch (Method)
{
case "UserNameLogin" : UserNameLogin(); break;
case "UserPhoneLogin": UserPhoneLogin(); break;
case "UserExit": UserExit(); break;
}

}

public void UserExit() //退出用户
{
Mcontext.Session["User"] = null;
Mcontext.Session["BUser"] = null;
Mcontext.Response.Write("<script> alert('退出成功!');</script>");
Mcontext.Response.Write("<script> location.href='index.aspx'; </script>");
}

public void UserPhoneLogin()//根据手机号登录
{
string UserType = "";
string UserName = "";
string UserPassword = "";
UserType = Mcontext.Request["usertype"];
UserName = Mcontext.Request["username"];
UserPassword = Mcontext.Request["password"];

if (UserType == "1")//个人登录
{
FYM_User fu = new FYM_User();
fu.U_phone = UserName;
fu.U_password = UserPassword;
UserBLL ub = new UserBLL();

fu = ub.LoginByUpPwd(fu);

if (fu.id != 0)
{
Mcontext.Session["User"] = fu;
Mcontext.Session["BUser"] = null;

Mcontext.Response.Write("<script> alert('登录成功!欢迎您:" + fu.U_username + "您的用户类别为个人用户');</script>");
Mcontext.Response.Write("<script> location.href='index.aspx'; </script>");
}
else
{
Mcontext.Response.Write("<script> alert('登录失败,个人手机号或密码错误!');</script>");
Mcontext.Response.Write("<script> location.href='" + FromUrl + "'; </script>");
}


}

if (UserType == "2")//企业登录
{
FYM_BusinessUser fu = new FYM_BusinessUser();
fu.B_userphone = UserName;
fu.B_password = UserPassword;
BUserBLL ub = new BUserBLL();

fu = ub.LoginByUpPwd(fu);

if (fu.id != 0)
{
Mcontext.Session["User"] = null;
Mcontext.Session["BUser"] = fu;

Mcontext.Response.Write("<script> alert('登录成功!欢迎您:" + fu.B_username + "您的用户类别为企业用户');</script>");
Mcontext.Response.Write("<script> location.href='index.aspx'; </script>");
}
else
{
Mcontext.Response.Write("<script> alert('登录失败,企业联系人电话或密码错误!');</script>");
Mcontext.Response.Write("<script> location.href='" + FromUrl + "'; </script>");
}
}
}

public void UserNameLogin() //根据用户名登录
{
string UserType = "";
string UserName = "";
string UserPassword = "";
UserType = Mcontext.Request["usertype"];
UserName = Mcontext.Request["username"];
UserPassword = Mcontext.Request["password"];

if (UserType == "1")//个人登录
{
FYM_User fu = new FYM_User();
fu.U_username = UserName;
fu.U_password = UserPassword;
UserBLL ub = new UserBLL();

fu = ub.LoginByUnPwd(fu);

if (fu.id != 0)
{
Mcontext.Session["User"] = fu;
Mcontext.Session["BUser"] = null;

Mcontext.Response.Write("<script> alert('登录成功!欢迎您:"+fu.U_username+"您的用户类别为个人用户');</script>");
Mcontext.Response.Write("<script> location.href='index.aspx'; </script>");
}
else
{
Mcontext.Response.Write("<script> alert('登录失败,个人用户名或密码错误!');</script>");
Mcontext.Response.Write("<script> location.href='" + FromUrl + "'; </script>");
}


}

if (UserType == "2")//企业登录
{
FYM_BusinessUser fu = new FYM_BusinessUser();
fu.B_username = UserName;
fu.B_password = UserPassword;
BUserBLL ub = new BUserBLL();

fu = ub.LoginByUnPwd(fu);

if (fu.id != 0)
{
Mcontext.Session["User"] = null;
Mcontext.Session["BUser"] = fu;

Mcontext.Response.Write("<script> alert('登录成功!欢迎您:" + fu.B_username + "您的用户类别为企业用户');</script>");
Mcontext.Response.Write("<script> location.href='index.aspx'; </script>");
}
else
{
Mcontext.Response.Write("<script> alert('登录失败,企业用户名或密码错误!');</script>");
Mcontext.Response.Write("<script> location.href='" + FromUrl + "'; </script>");
}
}

}



public bool IsReusable {
get {
return false;
}
}

}


...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
另外最后,我不知道你的 ashx 是出自什么目的,要下载 html 代码。 如果你设计服务系统,我建议你按照“通用的”业务服务器的规范来设计。不管客户端是什么手机浏览器、wpf、winform还是别的什么,都可以访问同一套业务服务(尽管你的业务服务是以 http 协议访问)。只有极其个别情况下才专门为浏览器端去推送指令。 你的客户端应该使用好的前端 ui 框架(不管是多么简单强大的模板设计机制),不需要服务器端下载 html/javascript 代码。
  • 打赏
  • 举报
回复
你的 switch case 代码已经是程序设计中比较初级的了,没有扩展性,每一次扩展都需要重新破坏“大文件”,并且重新生成。一个比较好用一点的业务服务系统可能有200个服务,你难道弄200个case? “usertype=1、usertype=2”之类的代码,其实意思一样。基本上你不太进行设计,写到哪就想到哪(而架构师应该是想到哪写到哪),堆砌代码的痕迹太明显。 其实一个好的业务逻辑,不会推迟到最后还随便弄一堆“分支逻辑”。而是会从一开始就分不同的类进行统一模式化处理。
  • 打赏
  • 举报
回复
单就 UserAction.ashx?Method=UserNameLogin 这个 url 来看,我认为这非常繁琐、冗余。 一个 ashx 就进行一个明确的服务活动就够了。除非有绝对必要的理由,否则不恰当地“聚类”,你肯定要弄一堆 switch case 分支,增加了计划、开发、维护等的复杂性,降低了速度。这是最严重的缺点。
蝶恋花雨 2014-09-04
  • 打赏
  • 举报
回复
ashx 为一般处理程序,多用ajax post 请求后输出 http://blog.csdn.net/goodshot/article/details/8165821 ashx通常是实现IHttpHandler接口,因为不必继承自Page类,所以没有那么多事件需要处理,不必消耗太多资源,所以性能方面要比aspx高 可以这样写。注意加参数是否为空 判断 还有write后。需要Response.end(); http://www.cnblogs.com/AngelLee2009/archive/2013/09/24/3336847.html http://blog.csdn.net/feng_zhenrong/article/details/6985828
还想懒够 2014-09-04
  • 打赏
  • 举报
回复
建议看看.NET的MVC吧,有那么点JAVA的MVC的意思 就我个人喜好程度,我不大喜欢.NET的MVC模型,代码阅读起来比较费劲。 其实ashx也是同样的情况,代码阅读和维护的难度稍有点大。通常我这边除非是不要抛出HTML,像下载文件,ajax处理(含获取json)等这些不需要抛出HTML的,一般就使用ashx了,其余的均为aspx。 另外,有关你这代码的问题,ASP.NET对于Form认证有一套规则,建议搜一下ASP.NET Form认证,那里面完全满足你的要求,而不需要专门开设ashx来处理。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧