我正在创建一个webAPI,当我在请求字符串中包含冒号(:)时,
我收到此错误:
从客户端(:)检测到潜在危险的Request.Path值 [HttpException(0x80004005):从客户端(:)检测到一个潜在危险的Request.Path值。 System.Web.HttpRequest.ValidateInputIfRequiredByConfig()+9673044 System.Web.PipelineStepManager.ValidateHelper(HttpContext context)+53
我不打算在实际的api请求中包含特殊字符,但是如果某些不好的用户在请求中输入特殊字符,则会导致错误。
问题:如何在API端处理此错误?有什么办法吗?或者我应该给开发人员一个关于这个问题的说明吗?
注意:我无法控制将要访问API的未来客户。我正在使用Visual Studio 2012 for Web; .Net 4.0版; ASP.Net WebApi;和C#;我认为代码对我的情况来说是不必要的,Api除了那些特殊字符外都有效。但如果你不这么认为,请告诉我你还需要知道什么 另一个注意事项:我并没有试图找到在网址中允许它的方法,我只是在寻找专门处理错误的方法。
答案 0 :(得分:2)
如果您确实要允许,请尝试在web.config中设置relaxedUrlToFileSystemMapping = true
。
<httpRuntime relaxedUrlToFileSystemMapping = "true" />
MSDN Link和here it is在上下文中。
或者,进行此配置更改,然后选择返回相关的错误消息,或重定向它们或您想要做的任何事情。
编辑:如果您只想在单个方法的请求字符串中允许冒号,您始终可以使用[ValidateInput(false)]
修饰该操作方法,详见this answer of mine中的详细说明。这意味着您无需在web.config中降级请求验证。
答案 1 :(得分:0)
我会在他们的“最终用户”表示中避免网络广告中的字符串。
如果您确实需要传递文本,那么将其作为POST请求的参数传递会有所帮助。这个approch肯定适用于任何字符串
如果您必须通过GET请求执行此操作,请注意一些额外的编码/解码逻辑,以帮助您跨越Request.Path限制。 (这里我的意思是将原始字符串转换为某个url友好字符串的逻辑,并且在控制器端将对url友好字符串解码为原始字符串)。但老实说,我并不喜欢这种方法,因为通过解码你得到一个字符串,将其作为url的一部分插入后会被误解。
如果您的文本是服务器上“词典”的条目,那么我会将整数Id字段添加到您的实体的“词典”中,并使用实体ID作为您的web.API的参数。
答案 2 :(得分:0)
您可以实现ExceptionFilterAttribute。例如:
public class HttpExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Exception is HttpException)
{
actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
}
}
}
此属性可用于操作方法,控制器或全局。但是不要忘记在启动时注册此过滤器。 更多细节可以在这里找到:Exception Handling in ASP.NET Web API。