ASP.NET MVC部署GoDaddy主机时UrlHelper.RouteUrl抛出SecurityException
我之前帮朋友排查过几乎一模一样的GoDaddy部署问题,这个SecurityException大概率和主机的信任级别限制有关,咱们一步步来拆解解决:
先排查主机信任级别
GoDaddy的Windows虚拟主机默认大多是Medium Trust权限,而UrlHelper.RouteUrl方法在解析路由生成URL时,某些内部操作可能需要访问超出Medium Trust允许的系统资源或权限。你可以先打开站点根目录的web.config,查找<trust>节点——如果看到<trust level="Medium" />,那基本就是这个限制在作祟。尝试调整信任级别(如果套餐允许)
部分GoDaddy套餐支持修改信任级别为Full Trust,你可以在web.config的<system.web>节点下修改:
<system.web> <trust level="Full" originUrl="" /> </system.web>
不过要注意,不是所有套餐都开放这个权限,如果修改后站点报错,就别硬改,换下面的方法。
替换RouteUrl的实现方式
如果没法提升信任级别,咱们换一种生成URL的思路,绕过权限限制:- 用
Url.Action替代RouteUrl:
这个方法的权限要求更低,在Medium Trust环境下通常能正常运行。page.Url = _urlHelper.Action(routeValues["action"].ToString(), routeValues["controller"].ToString(), routeValues); - 如果路由规则比较简单,甚至可以手动拼接URL:
var baseUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); page.Url = $"{baseUrl}/{routeValues["controller"]}/{routeValues["action"]}";
- 用
确认MVC版本兼容性
还要检查本地开发用的ASP.NET MVC版本和GoDaddy主机上的版本是否一致。比如你本地用MVC 5,但主机只预装了MVC 3,也可能触发奇怪的权限或兼容性错误。可以在web.config里添加程序集绑定,强制指定MVC版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0" /> </dependentAssembly> </assemblyBinding> </runtime>
记得把newVersion改成你实际使用的MVC版本号。
- 获取详细异常信息定位问题
如果上面的方法都没解决,你可以临时开启自定义错误的调试模式,获取更具体的SecurityException堆栈信息:
<system.web> <customErrors mode="Off" /> </system.web>
调试完成后一定要改回<customErrors mode="RemoteOnly" />,避免泄露站点敏感信息。
内容的提问来源于stack exchange,提问作者Synesthetic Symphony

