标签: asp.net-routing

如何重定向到ASP.NET MVC中的动态登录URL

我正在创建一个多租户网站,为客户端托管页面.URL的第一部分将是一个字符串,用于标识客户端,使用以下URL路由方案在Global.asax中定义:

"{client}/{controller}/{action}/{id}"
Run Code Online (Sandbox Code Playgroud)

这样工作正常,使用/ foo/Home/Index等URL.

但是,当使用[Authorize]属性时,我想重定向到也使用相同映射方案的登录页面.因此,如果客户端是foo,则登录页面将是/ foo/Account/Login,而不是web.config中定义的固定/帐户/登录重定向.

MVC使用HttpUnauthorizedResult返回401未授权状态,我认为这会导致ASP.NET重定向到web.config中定义的页面.

那么有谁知道如何覆盖ASP.NET登录重定向行为?或者通过创建自定义授权属性来重定向MVC会更好吗?

编辑 - 答:在深入研究.Net源代码后,我认为自定义身份验证属性是最佳解决方案:

public class ClientAuthorizeAttribute: AuthorizeAttribute
{
    public override void OnAuthorization( AuthorizationContext filterContext )
    {
        base.OnAuthorization( filterContext );

        if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    { "client", filterContext.RouteData.Values[ "client" ] },
                    { "controller", "Account" },
                    { "action", "Login" },
                    { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
                });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.net authentication asp.net-mvc forms-authentication asp.net-routing

95
推荐指数
2
解决办法
4万
查看次数

ASP.NET MVC,URL路由:最大路径(URL)长度

情景

我有一个应用程序,我们采用了旧的查询字符串URL结构:

?x=1&y=2&z=3&a=4&b=5&c=6
Run Code Online (Sandbox Code Playgroud)

并将其更改为路径结构:

/x/1/y/2/z/3/a/4/b/5/c/6
Run Code Online (Sandbox Code Playgroud)

我们正在使用ASP.NET MVC和(自然地)ASP.NET路由.

问题

问题是我们的参数是动态的,并且(理论上)我们需要适应的参数数量没有限制.

这一切都很好,直到我们受到以下列车的打击:

HTTP错误400.0 - 错误请求ASP.NET在URL中检测到无效字符.

当我们的URL超过一定长度时,IIS会抛出此错误.

Nitty Gritty

这是我们发现的:

这不是IIS问题

IIS确实有最大路径长度限制,但上面的错误不是这个.

了解dot iis dot net如何使用请求过滤部分"根据请求限制过滤"

如果IIS的路径太长,它将抛出404.14,而不是400.0.

此外,IIS最大路径(和查询)长度是可配置的:

<requestLimits


   maxAllowedContentLength="30000000"


   maxUrl="260"


   maxQueryString="25" 


              />
Run Code Online (Sandbox Code Playgroud)

这是一个ASP.NET问题

经过一番探讨:

IIS论坛主题:ASP.NET 2.0最大URL长度? http://forums.iis.net/t/1105360.aspx

事实证明,这是一个ASP.NET(嗯,真正的.NET)问题.

事情的核心是,据我所知,ASP.NET无法处理超过260个字符的路径.

在棺材中的钉子,这是由菲尔哈克本人证实的:

Stack Overflow ASP.NET url MAX_PATH limit问题ID 265251

问题

那么问题是什么?

问题是,这有多大的限制?

对于我的应用程序,它是一个交易杀手.对于大多数应用程序,它可能不是问题.

披露怎么样?没有提到ASP.NET路由的地方我听过这个限制的窥视.ASP.NET MVC使用ASP.NET路由这一事实使其影响更大.

你怎么看?

iis url asp.net-mvc routing asp.net-routing

65
推荐指数
4
解决办法
6万
查看次数

Api控制器声明多个Get语句

在MVC4中使用新的Api控制器,我发现了一个问题.如果我有以下方法:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

这会奏效.但是,如果我想要检索不同类型的某些不同数据,则默认为该GetAll方法,即使将$.getJSON其设置为GetAllIntegers方法:

public IEnumberable<int> GetAllIntergers()

(错误的命名约定)

我有可能做到这一点吗?

我可以GetAll在Web API控制器中只有一个方法吗?

我认为可视化我想要实现的目标更容易.以下是一段代码,用于展示我希望能够做到的单一内容ApiController:

public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-routing asp.net-mvc-4 asp.net-web-api

43
推荐指数
2
解决办法
3万
查看次数

ASP.NET Routing可用于为.ashx(IHttpHander)处理程序创建"干净"的URL吗?

我有一些使用普通旧IHttpHandler的REST服务.我想生成更干净的URL,以便我在路径中没有.ashx.有没有办法使用ASP.NET路由创建映射到ashx处理程序的路由?我以前见过这些类型的路线:

// Route to an aspx page
RouteTable.Routes.MapPageRoute("route-name",
    "some/path/{arg}",
    "~/Pages/SomePage.aspx");

// Route for a WCF service
RouteTable.Routes.Add(new ServiceRoute("Services/SomeService",
    new WebServiceHostFactory(),
    typeof(SomeService)));
Run Code Online (Sandbox Code Playgroud)

尝试使用会RouteTable.Routes.MapPageRoute()产生错误(处理程序不会派生出错Page). System.Web.Routing.RouteBase似乎只有2个派生类:ServiceRoute用于服务,DynamicDataRoute用于MVC.我不确定是什么MapPageRoute()(Reflector没有显示方法体,它只显示"在NGen图像边界内嵌这种方法的性能至关重要").

我看到它RouteBase没有密封,并且有一个相对简单的界面:

public abstract RouteData GetRouteData(HttpContextBase httpContext);

public abstract VirtualPathData GetVirtualPath(RequestContext requestContext,
    RouteValueDictionary values);
Run Code Online (Sandbox Code Playgroud)

所以也许我可以制作自己的HttpHandlerRoute.我会给出一个镜头,但如果有人知道现有的或内置的映射路由到IHttpHandlers的方式,这将是伟大的.

asp.net asp.net-routing ihttphandler

26
推荐指数
5
解决办法
1万
查看次数

MVC:路由获取/发布到不同的控制器.怎么样?

我正在编写一个MVC控制器,我需要同时处理数据返回以及长期轮询"数据已经改变",就像来自SAME(!)url的行为一样.我无法做到这一点 - 我正在为现有的应用程序实现代理,所以我无法对API进行任何扩展/修改.

我的主要问题是:*POST操作必须立即完成.*GET操作需要更长时间(有时可能需要数小时).

我可以以某种方式重写两个去不同的控制器?另一种选择是......嗯......同时做两个异步,只有POST完成三个然后.

有人对此发表评论吗?

asp.net-routing asp.net-mvc-3

21
推荐指数
1
解决办法
7763
查看次数

IIS 6上的ASP.NET路由

使用我创建了一个基本的网站ASP.NET根据迈克·奥蒙德的例子路由"使用ASP.NET MVC路由独立".这在运行内置Web服务器的本地计算机上运行良好.

但是,当我将其部署到我的服务器(Windows Server 2003,IIS 6,ASP.NET 3.5 SP1)时,它只显示404错误.

我在某处读过我打算设置通配符路由.我怎样才能做到这一点?

还需要进行哪些其他配置更改才能使其在我的服务器上运行?

iis-6 asp.net-routing

18
推荐指数
2
解决办法
1万
查看次数

在IIS 7.5上的同一端口上运行两个网站?

我们需要能够在同一个Intranet服务器和端口号上运行一个ASP.net Web应用程序的两个版本,但是一个映射到/,另一个映射到/ experimental(不是真实姓名,但足够接近).

C:\ inetpub\wwwroot\Version1 => http://test1.organization.com/ C:\ inetpub\wwwroot\Version2 => http://test1.organization.com/experimental

第一个URL已经暴露给一些beta用户,因此需要保持一定的稳定性.第二个将包含实验代码,只有用户进入/实验将会看到.我们没有使用其他服务器或不同端口的选项.

我以前通过/映射到IIS中的站点下的站点,然后将第二个站点添加为其下的应用程序,并将其别名化为/ site2来实现此目的.

服务器站点默认网站<=物理路径映射到第一个版本和//Application1 <=嵌套应用程序映射到第二个版本和/ experimental

但是,这似乎很草率.使用重写规则或使用ARR执行此操作会更清晰吗?如果是这样,怎么样?

谢谢!

asp.net iis asp.net-routing request

13
推荐指数
1
解决办法
2万
查看次数

ASP.NET路由:令牌之间的文字子段,以及带有来自文字子段的字符的路由值

我问的原因是因为IIS保护某些ASP.NET文件夹,如Bin,App_Data,App_Code等.即使URL没有映射到实际的文件系统文件夹,IIS也会拒绝路径段等于其中一个的URL提到的名字.

这意味着我不能有这样的路线:

{controller}/{action}/{id}
Run Code Online (Sandbox Code Playgroud)

...其中id可以是任何字符串,例如

Catalog/Product/Bin
Run Code Online (Sandbox Code Playgroud)

因此,我没有禁用此安全措施,而是愿意在id之前使用后缀更改路由,如下所示:

{controller}/{action}_{id} // e.g. Catalog/Product_Bin
{controller}/{action}/_{id} // e.g. Catalog/Product/_Bin
Run Code Online (Sandbox Code Playgroud)

但是如果id包含新的分隔符,这些路由将不起作用,在这种情况下,例如

// These URL won't work (I get 404 response)
Catalog/Product_Bin_
Catalog/Product/_Bin_
Catalog/Product/__Bin
Run Code Online (Sandbox Code Playgroud)

为什么?我不知道,对我来说就像一个小虫.如何使这些路由工作,其中id可以是任何字符串?

asp.net iis routing asp.net-routing

12
推荐指数
1
解决办法
603
查看次数

ASP.Net Mvc 3 Url.Action方法使用先前请求的参数值

当使用Url.Action帮助程序自动生成Urls时,如果页面包含类似于的行

@ Url.Action( "编辑", "学生")

预计将产生一个像domain/student/edit它一样的URL 并且它按预期工作.但是,如果请求的URL包含一些参数,例如domain/student/edit/210,上面的代码使用前一个请求中的这些参数并生成类似的东西,即使我没有为该Action方法提供任何此类参数.

简而言之,如果请求的网址包含任何参数,则无论我是否在Url.Action方法中指定,任何自动生成的网页链接(为该请求提供服务)都将包含这些参数.

出了什么问题?

asp.net-routing razor asp.net-mvc-3

11
推荐指数
2
解决办法
3万
查看次数

ASP.NET MVC4 ...是"BIN"保留的关键字?

我有一个股票查询应用程序,它根据股票代码返回数据.

基本上,AJAX呼叫转到~/Stocks/GetStockData/{id}其中{id}为股票代码.

一般情况下这很好用.今天,我发现有"BIN"标志的"Progressive Waste Solutions Ltd."股票爆炸了.查看浏览器中的返回数据,我看到它为此符号返回404.

在我看来,BIN可能是一个保留字,要求一些二进制文件或其他东西.是这样的吗?如何在不花费大量精力的情况下解决这个问题?还有其他关键字也会导致此问题吗?

UPDATE

根据Artyom Neustroev,这可能是一个保留的关键字,并且可以防止路由到.他引用了一篇引用网站的文章,其中说明了解决方法是在配置文件中添加以下配置设置:

<configuration>
  <system.web>
    <httpRuntime relaxedUrlToFileSystemMapping="true"/>

    <!-- ... your other settings ... -->
  </system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)

......让我更进一步.用这个运行我的网站时,ajax调用返回404.8错误:

HTTP Error 404.8 - Not Found
The request filtering module is configured to deny a path in the URL that contains a hiddenSegment section.
Run Code Online (Sandbox Code Playgroud)

好吧,这实际上是有道理的.路由设置为阻止某人进入我的bin目录,我赞成这种预防.

所以我想知道如何告诉一组特定的方法,如果有一个定义的路线,那么得到的东西BIN,或 CONFIG(理论上)是好的?

c# iis asp.net-mvc asp.net-routing asp.net-mvc-4

11
推荐指数
1
解决办法
768
查看次数