我正在创建一个多租户网站,为客户端托管页面.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
我有一个应用程序,我们采用了旧的查询字符串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会抛出此错误.
这是我们发现的:
IIS确实有最大路径长度限制,但上面的错误不是这个.
了解dot iis dot net如何使用请求过滤部分"根据请求限制过滤"
如果IIS的路径太长,它将抛出404.14,而不是400.0.
此外,IIS最大路径(和查询)长度是可配置的:
<requestLimits
maxAllowedContentLength="30000000"
maxUrl="260"
maxQueryString="25"
/>
Run Code Online (Sandbox Code Playgroud)
经过一番探讨:
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路由这一事实使其影响更大.
你怎么看?
在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) 我有一些使用普通旧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的方式,这将是伟大的.
我正在编写一个MVC控制器,我需要同时处理数据返回以及长期轮询"数据已经改变",就像来自SAME(!)url的行为一样.我无法做到这一点 - 我正在为现有的应用程序实现代理,所以我无法对API进行任何扩展/修改.
我的主要问题是:*POST操作必须立即完成.*GET操作需要更长时间(有时可能需要数小时).
我可以以某种方式重写两个去不同的控制器?另一种选择是......嗯......同时做两个异步,只有POST完成三个然后.
有人对此发表评论吗?
使用我创建了一个基本的网站ASP.NET根据迈克·奥蒙德的例子路由"使用ASP.NET MVC路由独立".这在运行内置Web服务器的本地计算机上运行良好.
但是,当我将其部署到我的服务器(Windows Server 2003,IIS 6,ASP.NET 3.5 SP1)时,它只显示404错误.
我在某处读过我打算设置通配符路由.我怎样才能做到这一点?
还需要进行哪些其他配置更改才能使其在我的服务器上运行?
我们需要能够在同一个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执行此操作会更清晰吗?如果是这样,怎么样?
谢谢!
我问的原因是因为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可以是任何字符串?
当使用Url.Action帮助程序自动生成Urls时,如果页面包含类似于的行
@ Url.Action( "编辑", "学生")
预计将产生一个像domain/student/edit它一样的URL 并且它按预期工作.但是,如果请求的URL包含一些参数,例如domain/student/edit/210,上面的代码使用前一个请求中的这些参数并生成类似的东西,即使我没有为该Action方法提供任何此类参数.
简而言之,如果请求的网址包含任何参数,则无论我是否在Url.Action方法中指定,任何自动生成的网页链接(为该请求提供服务)都将包含这些参数.
出了什么问题?
我有一个股票查询应用程序,它根据股票代码返回数据.
基本上,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(理论上)是好的?
asp.net-routing ×10
iis ×4
asp.net ×3
asp.net-mvc ×3
c# ×2
routing ×2
.net ×1
ihttphandler ×1
iis-6 ×1
razor ×1
request ×1
url ×1