代码改变世界

记一次Url重写_发布之后iis 404

2014-08-24 21:48  stoneniqiu  阅读(...)  评论(...编辑  收藏

    把api封装完,客户要求app的url能不能不变(客户之前用的php的api开发app,已经开发了很多了,所以希望不改动url)。但是这个规则要求是:xx/api.php?s=/{controller}/{action}&{parms},而我的直接就是xx/{controller}/{action} ?parms。改动web api的路由却不能包含“?”这个特殊字符。而且api.php之后都是参数,而我action之后才是参数。所以必须重写Url。

 public class UrlWriter : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            //获得当前页面请求管道的HttpApplication对象
            HttpApplication application = sender as HttpApplication;
            HttpContext context = application.Context;//获得上下文对象
            //string url = context.Request.Url.LocalPath;//获得URL(不包含域名和路径)
            string url = context.Request.Url.AbsoluteUri;//获得URL(不包含域名和路径)
            //api.php?s= /controller/action&name=miyu&pwd=123 ---> controller/action?parms=
            Regex reg1 = new Regex("/WebForm2/[A-Z0-9a-z_]+");//注意文件夹与文件名称的大小写.
            if (url.Contains("api.php?s=")) //这种情况是匹配根据ID值来查看某个文章的内容。
            {
                url = url.Replace("api.php?s=", "|");
                var controller = "";
                var action = "";
                var parms = "";
                var baseurl = url.Split('|')[1]; //得到 类似于User/Login&.... 或者 User/Login ....
                if (baseurl.Contains("&"))
                {
                    var cap = baseurl.Split('&');
                    var ca = cap[0].Split('/');
                    controller = ca[0];
                    action = ca[1];
                    //User/login&name=miyu&pwd=123
                    parms = "?";
                    for (int i = 1; i <= cap.Length-1; i++)
                    {
                        if (i < cap.Length - 1) //共有cap.length-1个参数
                        {
                            parms += cap[i] + "&";
                        }
                        else
                        {
                            parms += cap[i] ;//最后一个参数 不需要再加& 
                        }
                    }
                }
                else
                {
                    var ca = baseurl.Split('/');
                    controller = ca[0];
                    action = ca[1];
                }

                var newurl = string.Format("/api/{0}/{1}{2}", controller, action, parms);

                context.RewritePath(newurl); //前台的列表页就可以这样写:<a href='../WebForm2/<%#Eval("id")%>'></a>
            }
            
        }


        public void Dispose()
        {
            throw new NotImplementedException();
        }
    }

 然后在web.config中加入:

 <httpModules>
      <add name="UrlReWriter" type="AS.GroupOn.Web.UrlWriter, AS.GroupOn.Web, Version=1.0.0.0, Culture=neutral" />
    </httpModules>
  </system.web>

Debug的时候就ok了。但发布上了iis 却404 找不到资源。因为iis将.php 识别成了一个资源文件。

最后找到方法:站点--> 属性--》主目录

点击配置:

可执行文件就是我们的C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll。 (32位选32位的)

扩展名加入 .php

 

取消判断确认文件是否存在 就ok了。