我的微薄

2011年4月7日

【转】利用IHttpHandler实现ASP.NET URL重写

IHttpHandler接口实现类OwnHttpHandler:

程序代码如下:

using System;
using System.Web;
using System.Text.RegularExpressions;
using System.Collections.Generic;

/// <summary>
///IHttpHandler 接口实现类
/// </summary>
public class OwnHttpHandler : IHttpHandler
{
    #region IHttpHandler 成员

    /// <summary>
    /// 当前处理器是否还可以被另一个请求重复使用
    /// </summary>
    public bool IsReusable
    {
        get { return true; }
    }

    /// <summary>
    /// 对请求响应时,实际执行的代码
    /// </summary>
    /// <param name="context"></param>
    public void ProcessRequest(HttpContext context)
    {
        //这边为方便演示直接往集合添加规则,实际应用可考虑将规则写到配置文件中再读取
        Dictionary<string, string> rules = new Dictionary<string, string>();
        rules.Add(@"^/news/(\w+)\.aspx", "/news.aspx?t=$1");
        rules.Add(@"^/soft/(\w+)\.aspx", "/soft.aspx?t=$1");
        rules.Add(@"^/music/(\w+)\.aspx", "/music.aspx?t=$1");

        foreach (KeyValuePair<string, string> rule in rules)
        {
            Match match = Regex.Match(context.Request.Path, rule.Key, RegexOptions.IgnoreCase);
            if (match.Success)
            {
                string sendToUrl = Regex.Replace(context.Request.Path, rule.Key, rule.Value, RegexOptions.IgnoreCase);
                string path = sendToUrl;//虚拟路径
                string querystring = string.Empty;//查询参数
                if (sendToUrl.IndexOf("?") != -1)
                {
                    path = sendToUrl.Substring(0, sendToUrl.IndexOf("?"));
                    querystring = sendToUrl.Substring(sendToUrl.IndexOf("?") + 1);
                }

                context.Server.Execute(path + "?" + querystring);

                return;
            }
        }

        context.Response.Write("404:页面未找到!");
    }

    #endregion
}
 使用非常简单,只需在配置文件web.config的<system.web>节点中加入下边节点即可
配置代码如下:
<httpHandlers>
  <add verb="*" path="/news/*.aspx" type="OwnHttpHandler" />
  <add verb="*" path="/soft/*.aspx" type="OwnHttpHandler" />
  <add verb="*" path="/music/*.aspx" type="OwnHttpHandler" />
</httpHandlers>
附加说明
 
·是否需重写,两者都是对路径进行匹配来决定,HTTP模块可以用正则,HTTP处理程序只能用通配符*、?;
·HTTP模块的匹配规则可以放在任何可调用到的地方,HTTP处理程序的匹配规则只能放在配置文件中;
·所有HTTP模块在请求时都会被调用,一次请求中只有路径和path属性值匹配的那个HTTP处理程序才会被调用;
·如果HTTP模块中不理行重写那将访问真实文件,HTTP处理程序中不进行重写访问不到真实文件,显示空白页;

 

IIS处理和ASP。NET处理请求的模式

 

转发目的是想寻求更多的爱好者一起探讨。此方案在研究中,如果有心得会进行补充。

原文地址:http://www.mzwu.com/article.asp?id=1907

(MSDN)在 ASP.NET 中执行 URL 重写:http://msdn.microsoft.com/zh-cn/library/ms972974.aspx

 


posted @ 2011-04-07 11:38 三角函数 阅读(149) 评论(0) 编辑

2011年1月17日

【转】阳历转换阴历的换算方法(经过部分修改,现在能显示得正确)

摘要: 网上有一个很经典的算法,可以计算出阳历时间对应的阴历时间,据测试在春节之前的时间,但是又过了元旦,那个时间段显示不正确,对此进行了修正。在此跟大家分享。已经全部注释好了。对此算法有更高见解的达人还请多多指教!~阅读全文

posted @ 2011-01-17 18:17 三角函数 阅读(1609) 评论(0) 编辑

2010年11月15日

集团客户管理系统之彩信组件的总结

     最近一个人做了这个彩信组件,说来也是颇为辛苦呀。自己刚毕业半年,底子一般,就一个人从数据库设计开始设计程序,确实有些吃力!不过老大给咱这个机会,不能不好好把握。这次彩信组件从设计到开发也有两个月了。最开始花了两周时间调用第三方公司的彩信平台做了个彩信组件,加入到现在的平台中。这个过程也对一些细节方面的东西有了更好的理解。接下来的近三周中。一直在设计程序架构。以前一直习惯程序一条线的,现在不得不考虑更多的东西了。比如说:(1),面向接口的架构设计。(2),数据存储优化,必须大量使用缓存。(3)、多线程的操作,发送和接收的流程要实现更高的效率,达到每秒5-6条,这个是需要着重考虑的。(4)、进程间的通信,上行页面和服务之间的通信。这个采用了命名通道通信的方式。找到了一个不错的组件,调用一个方法就可以实现进程间的通信。而且效率很高!呵呵~(5)、用Tcp/IP短连接实现基于http的soap短连接来传输彩信。按照之前的处理方式,目前也是采取这种做法,对于网关那边的说明,也没有更详细的介绍,哎~开发人员只能靠猜测和询问来开发,不得不说这是很郁闷的。

    今天算是基本告一段落,上行下行都能测试完成了。状态报告也都能及时的收到。也就是基本可以搞定了。再花两天来调试下,就可以上正式网关测试了。先小小的庆祝一下!

    不过还有几个问题尚有改进的余地,由于个人实力有限尚未进行优化。

   (1)目前只支持一个端口和网关相连接。如果多个端口相连接,需要修改部分代码,原本打算是做成根据配置的连接点参数个数来实例化连接的,但是在处理静态配置项时候不能实例化,所以放弃了这个想法。

    (2)接收下行彩信回复包的线程收到的包概率只有大约50%。也就是说一半都丢失了。只有根据模拟网关的状态报告来确定是否发送成功。我的开发机器是1G内存的。不知道是不是由于机器不行,影响了测试结果。也找不到更好的机器了,在此期待有经验的达人分享下经验。

    (3)我用的一个.ashx页面做的代理页面,来接收上行彩信,以及状态报告。但是我response回到页面的内容,并没有出现在模拟网关上。不知道是我封装的响应包不对,还是怎么的。汗~

   

     不管怎么样,又是一个项目搞定了。准备搞其他的项目了。在此记录下,以后有机会,也能记得哪里有问题进行重构和修改。也希望能和大家一起讨论下。呵呵~

posted @ 2010-11-15 16:22 三角函数 阅读(134) 评论(1) 编辑

2010年10月28日

华为彩信模拟器的相关注意点

由于本公司是移动的合作伙伴,因此项目也与移动业务直接挂钩。最近开发了一个彩信项目,于是用华为彩信模拟器来进行测试。在此过程中遇到了很多问题,到现在已经一一解决了。由于原有的文档超级简单不能解决实际问题。因此在这里记录下来也算是作为补充。

 

首先是设置下行地址问题。下行地址填写在Listen Port里面,就是开发程序中的MMSCIP(彩信网关的ip地址),要填写完全。

再一个就是设置上行地址 填写在Send To里面。由于彩信采用的是 基于http的soap协议。所以上行地址实际上是一个url地址。本人尝试过用Tcp通信来获取数据,结果是悲剧的。总是获取不到数据。因此需要写一个页面,用来接收网关的彩信。推荐使用ashx页面。至于为什么,可以去MSDN上面看以看ashx的作用。它主要能监听http请求,那么写一个服务来获取页面的数据进行解包就可以获取到上行彩信了。

 

做好了这两步,测试还是有问题。它会提示如下错误:

“没有说明名称空间前缀"soap-env"。”
2009-6-24 17:20:05 com.sun.xml.internal.messaging.saaj.soap.MessageImpl writeTo
严重: SAAJ0540: Error during saving a multipart message

 

对于这个问题已经有高手进行解答了,我只说下高手的具体操作,我也是尝试了几天尝试出来的。本人不太懂java的机制,呵呵~。转入正题吧!

首先把高手的解决方法copy过来。

 

这个问题需要在系统属性中设置javax.xml.soap.MessageFactory和javax.xml.soap.SOAPConnectionFactory。实际上华为的彩信模拟器MMSCSimulation.exe是一个可执行的jar包,用WinRar将该文件展开到你的工作目录下,然后执行java -Xmx1024m -Xms1024m  -Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.MessageFactoryImpl -Djavax.xml.soap.SOAPConnectionFactory=com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory com.huawei.mms.simulation.MM7Simulation启动模拟器。


我说的解决方法限于对java不是很了解的。net人士,java高手可以说说更好的方法哦。具体有两种操作方式:

1.找到你的jdk目录 运行->cmd-> cd (java.exe所在的目录绝对路径) 。切换的这个路径之后,输入这段命令java -Xmx1024m -Xms1024m  -Djavax.xml.soap.MessageFactory=com.sun.xml.messaging.saaj.soap.MessageFactoryImpl -Djavax.xml.soap.SOAPConnectionFactory=com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnectionFactory com.huawei.mms.simulation.MM7Simulation   就可以正确启动模拟器了。

这个处理方法,常见的错误有两个:(1)路径没设置正确,无法运行命令。(2)机器配置太差,如果机器配置太差,就更改下Xmx1024m,改为Xmx512m或者Xmx256m 两个都要改。一般就可以解决这个问题了。

 

2.运行->cmd->cd (模拟器所在的绝对路径) 。切换之后输入上面的那段命令。就可以正确启动模拟器了。错误处理法参考解决方法1。

 

运行之后则不会出现  “ 没有说明名称空间前缀"soap-env"。” 错误了。

如图:

 

打开Detail,就可以看到正确的包了。

特此分享一下,希望能帮到大家。

posted @ 2010-10-28 16:54 三角函数 阅读(499) 评论(0) 编辑